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/


Log in to reply