Mein Hintergrund: Ich habe vor einigen Monaten angefangen, mit OpenGL zu experimentieren, für keinen bestimmten Zweck, nur Spaß. Ich fing an, das OpenGL-Redbook zu lesen und kam so weit, ein Planetensystem mit vielen verschiedenen Lichtquellen zu bauen. Das dauerte einen Monat, und mein Interesse für openGL ging weg. Es erwachte vor etwa einer Woche wieder, und wie ich aus einigen SO-Beiträgen erfahren habe, ist das Redbook veraltet und das OpenGL-Superbible ist eine bessere Quelle zum Lernen. Also fing ich an, es zu lesen. Ich mag das Konzept von Shadern, aber es gibt ein echtes Durcheinander in meinem Gehirn wegen des Übergangs von meinen alten Erinnerungen an die feste Pipeline und das neue Konzept von Shadern.
Frage: Ich würde gerne einige Aussagen schreiben, die ich für richtig halte und ich bitte OpenGL-Experten, diese zu überprüfen (d. h., ob ich richtig verstehe, nicht ganz richtig oder absolut falsch). Also ...
1) Wenn wir kein Shaderprogramm verwenden, ändert sich nichts. Wir haben aktuelle Farbe, aktuelle Normale, aktuelle Transformationsmatrix, alles aktuell, und sobald wir glVertex**(...)
aufrufen, werden diese aktuellen Werte genommen und der Vertex wird gespeist ... ich weiß nicht was. Tatsache ist, dass es mit der aktuellen Matrix transformiert wird, die aktuelle Farbe und die Normale werden darauf angewendet usw.
2) Sobald wir ein Shader-Programm verwenden, funktioniert all das oben Gesagte nicht mehr. Das heißt, glColor
, glRotate
usw. machen keinen Sinn (Do you?). Ich meine, glColor
setzt immer noch die aktuelle Farbe, glRotate
multipliziert immer noch die aktuelle Matrix mit der Rotationsmatrix, aber diese werden überhaupt nicht verwendet. Stattdessen füttern wir Vertex-Attribute nach glVertexAttrib
. Welches Attribut bedeutet, was vollständig von unserem Vertex Shader und der in
Variablenbindung abhängt. Wir finden auch ans die Werte der Uniformen und rufen dann glVertex
auf und der Shader wird ausgeführt (ich weiß nicht sofort oder nachdem glEnd () aufgerufen wurde). Die eigentliche Vertex- und Fragmentverarbeitung wird im Shader-Programm vollständig manuell durchgeführt.
3) Shader fügen dem Tiefen-Test nichts hinzu. Das heißt, ich muss mich nicht in einem Shader darum kümmern. Ich rufe nur glEnable(GL_DEPTH_TEST)
an. Weder ist die Gesichtskeulung betroffen.
4) Alpha-Blending und Antialiasing müssen bei Shadern nicht beachtet werden. glEnable
Aufrufe werden ausreichen.
5) Ist es eine gute Idee, gluPerspective, glRotate, glPushMatrix und andere Matrixfunktionen zu verwenden und dann die aktuelle Matrix abzurufen und sie als Uniform einem Shader zuzuführen? Daher wird es keine Notwendigkeit geben, eine Matrixbibliothek von Drittanbietern zu verwenden.
Es kommt darauf an, über welche Version von OpenGL du redest. Bis zu OpenGL 3.0 sind alle fixen Funktionen vorhanden. Wenn Sie sich also dafür entscheiden, nur feste Funktionalität zu verwenden, funktioniert es wie immer. Von 3.0 an war ein Teil der festen Pipeline veraltet und ab 3.1 verschwindet sie vollständig. Mit diesen haben Sie nicht mehr wirklich die Möglichkeit, nur die feste Pipeline zu verwenden.
Auch hier kommt es darauf an. Zum Beispiel wird glColor über OpenGL 3.0 weiterhin unterstützt, selbst wenn Sie einen Shader verwenden. Der Unterschied besteht darin, dass er nicht automatisch auf das gezeichnet wird, was er gezeichnet hat, sondern auf den Shader, der ihn unverändert verwenden, ändern oder ganz ignorieren kann. Ihr Fragment-Shader empfängt also gl_FrontColor und gl_BackColor und schreibt die tatsächliche Fragmentfarbe in gl_FragColor. Wenn Sie OpenGL 3.1 oder neuer verwenden, ist z. B. glColor (zum Beispiel) nicht mehr vorhanden - eine Farbe ist nur ein weiterer Wert, den Sie an Ihren Shader liefern, als ob Sie irgendetwas anderes könnten / würden.
Das ist korrekt, zumindest bis OpenGL 3.1. Seit 4.0 gibt es einen neuen Compute Shader, der (wie ich glaube) in Dinge wie Tiefentests involviert werden kann (aber ich habe es nicht benutzt, also bin ich mir da etwas unsicher).
Ja, Sie können immer noch die integrierte Alpha-Überblendung verwenden. Abhängig von Ihrer Hardware sollten Sie vielleicht auch die Erweiterung gl_ARB_draw_buffers_blend erwägen (die ab OpenGL 4 obligatorisch ist, wenn ich mich richtig erinnere).
Das hängt wiederum von der Version von OpenGL ab, von der Sie sprechen. Das aktuelle OpenGL eliminiert vollständig jegliche Unterstützung für Matrizen, so dass Sie keine andere Wahl haben, als eine andere Matrixbibliothek zu verwenden. Ältere Versionen haben Dinge wie gl_ModelViewMatrix und gl_NormalMatrix Ihrem Shader als Uniform bereitgestellt, so dass Sie diese Route wählen könnten, wenn Sie dies gewählt haben.
2) In modernen OpenGL gibt es keine glColor, glBegin, glVertex, glRotate usw., so dass sie keinen Sinn ergeben.
5) Im modernen OpenGL gibt es keine eingebauten Matrizen, also müssen Sie eine 3rd-Party-Bibliothek verwenden oder eigene schreiben. Um deine Frage zu beantworten, nein, es ist keine gute Idee.
Tags und Links opengl