2010-09-19 9 views
8

Kann jemand eine Anleitung zum Erlernen des OpenGL 3.2 Kernprofils vorschlagen?OpenGL 3.2 Core Profile Guide

Das SDK ist schwer zu lesen, und die meisten der Anleitungen, die ich gesehen habe, haben nur die alte Methode gelehrt.

Antwort

28

Ich kenne keine guten Führer, aber ich kann Ihnen eine kurze Zusammenfassung

machen Ich gehe davon aus, dass Sie werden mit den Grundlagen von Shadern bereits vertraut sind, Vertex-Puffer, etc. Wenn Sie das nicht tun, ich schlage vor, Sie zum ersten Mal statt einen Leitfaden über Shadern lesen, weil alle OpenGL 3 auf der Verwendung von Shadern

bei Initialisierung basiert:

  • erstellen und Vertex-Puffer füllen glGenBuffers verwenden, glBindBuffer(GL_ARRAY_BUFFER, bufferID) und glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW)

  • Das Gleiche gilt für Indexpuffer, mit der Ausnahme, dass Sie GL_ELEMENT_ARRAY_BUFFER statt GL_ARRAY_BUFFER

  • Texturen genau erstellen verwenden, wie Sie in früheren Versionen von OpenGL haben (glGenTextures, glBindTexture, glTexImage2D)

  • erstellen Shadern mit glCreateShader, legen Sie ihren GLSL-Quellcode mit glShaderSource fest, und kompilieren Sie sie mit glCompileShader; Sie können überprüfen, ob es mit glGetShaderiv(shader, GL_COMPILE_STATUS, &out) gelungen und glGetShaderInfoLog

  • Erstellen von Programmen (zB. eine Gruppe von Shadern zusammen gebunden, in der Regel einen Vertex-Shader und ein Fragment-Shader) mit glCreateProgram, dann binden den Shadern Sie wollen mit mit Fehlermeldungen abrufen glAttachShader, dann link das Programm mit glLinkProgram;

    • Binden Sie die Vertex- und Indexpuffer mit glBindBuffer mit Argumenten GL_ARRAY_BUFFER und GL_ELEMENT_ARRAY_BUFFER bzw.

    • : mit glGetProgram und glGetProgramInfoLog wie Shadern können Sie Erfolg

    Wenn Sie zeichnen möchten überprüfen Verknüpfung

    Bind das Programm mit glUseProgram

  • Nun müssen Sie für jede variierende Variable in Ihren Shadern glVertexAttribPointer aufrufen, deren Syntax ähnlich wie die Legacy glVertexPointer, glColorPointer usw. ist.Funktionen, mit Ausnahme des ersten Parameters, der eine Kennung für das Variieren ist; Diese ID kann durch Aufrufen von glGetAttribLocation in einem verknüpften Programm abgerufen werden.

  • Für jede einheitliche Variable in Ihren Shadern müssen Sie glUniform anrufen; Der erste Parameter ist die Position (auch eine Art Bezeichner) der Uniform-Variablen, die Sie durch Aufruf von glGetUniformLocation abrufen können (Warnung: Wenn Sie ein Array namens "a" haben, müssen Sie die Funktion mit "a [0] aufrufen „)

  • für jede Textur, die Sie binden möchten, müssen Sie glActiveTexture mit GL_TEXTUREi nennen (i für jede Textur anders zu sein), dann glBindTexture und stellen Sie dann den Wert der Uniform i

  • Anruf glDrawElements

Thi Das sind die grundlegenden Dinge, die Sie tun müssen. Natürlich gibt es andere Sachen, wie Vertex-Array-Objekte, einheitliche Puffer usw., aber sie dienen nur zur Optimierung

Andere Domänen wie Culling, Blending, Viewports, etc. blieben weitgehend die gleichen wie in älteren Versionen von OpenGL

Ich schlage auch vor, Sie studieren this demo program (die Vertex-Array-Objekte verwendet). Die interessanteste Datei main.cpp

Hope this

+0

Eines der besseren modernen OpenGL helfen können (Kern 3.2+) „kurze Zusammenfassungen“ ich seit langem gesehen habe. Wird wahrscheinlich noch mehr Sinn machen, wenn Sie von 1.x/2.x kommen und versuchen, durch neuere Tutorials auf dem neuesten Stand zu sein. Gut als Mindmap. – Aktau

+2

Eine Sache, die mich stolperte war, dass Sie VAO und VBO zum Zeichnen verwenden müssen. Andernfalls erhalten Sie GL_INVALID_OPERATION beim Aufruf von glVertexAttribPointer. Das war zumindest unter Mac OS X der Fall. – YRH