OpenGL modernisieren: glBegin -> ???
-
TL,DR:
Wie wandelt man möglichst einfach glBegin/glEnd-Code in modernen OGL 3 Code um?Ich habe Code, der ungefähr so aussieht und funktioniert:
//Vertex Shader: varying vec4 color; //wird im pixel shader gebraucht void main(){ gl_Position = gl_Vertex; color = gl_Color; }
//OGL-Code //diamond { glBegin(GL_LINE_LOOP); glVertex2f(0, BLA); glVertex2f(BLA, 0); glVertex2f(0, -BLA); glVertex2f(-BLA, 0); glEnd(); } //cross { glBegin(GL_LINES); glVertex2f(0, BLA); glVertex2f(0, -BLA); glVertex2f(BLA, 0); glVertex2f(-BLA, 0); glEnd(); }
Das macht auf Intel HDs Probleme, die brauchen ewig einen GL-Kontext zu laden und ich will mich nicht auf krass veraltete Funktionen verlassen.
In den meisten Tutorials geht man so vor:
//vertex shader #version 150 in vec3 vert; void main() { gl_Position = vec4(vert, 1); }
//ogl-code glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(gProgram->attrib("vert")); glVertexAttribPointer(gProgram->attrib("vert"), 2, GL_FLOAT, GL_FALSE, 0, NULL); glDrawArrays(GL_LINE_LOOP, 0, 4);
Dabei bekomme ich einen Shaderfehler:
ERROR: 0:?: 'gl_Vertex': variable not available in current GLSL version ERROR: 0:?: 'gl_Color': variable not available in current GLSL version
Ohne Versionsdeklaration passiert einfach nichts. (Ich habe natürlich gl_Vertex durch vert ersetzt).
In dem anderen Thread über glBegin -> glDrawArrays hat es wohl jemand geschafft, ohne das Vertexarray an eine Shadervariable zu binden (oder das wurde nur nicht gezeigt).
Wie geht es richtig und möglichst ohne vert-Variable?
-
Schau dir das Tutorial hier an:
http://arcsynthesis.org/gltut/