Probleme beim Texturemapping bei GLSL [gelöst]



  • Hi,

    nachdem ich diese Seite
    http://www.c-plusplus.net/forum/285147

    vor einiger Zeit entdeckt habe, wollte ich versuchen einen eigenen Shader zu schreiben.
    Ich habe schon geschafft den Vertex und Fragmentschader zu laden und ein Dreieck auf dem Bildschirm anzuzeigen. Beim Versuch dieses Dreieck zu texturieren verzweifele ich jedoch.

    Hier die relevanten teile meines codes:

    #define BUFFER_OFFSET(i) ((char *)NULL + (i))
    GLuint  vertexTexcoordPositionsBufferObject;
    
    const float vertexTexcoordPositions[] = {
    	0.75f, 0.75f, 0.0f, 1.0f,       // Dreieck Ecke 1
    	1.0f, 1.0f,                     //Texturkoordinate 1
    	0.75f, -0.75f, 0.0f, 1.0f,      // Dreieck Ecke 2
    	1.0f, 0.0f,                     //Texturkoordinate 2
    	-0.75f, -0.75f, 0.0f, 1.0f,     // Dreieck Ecke 3
    	 0.0f, 0.0f,                    //Texturkoordinate 3
    };
    
    void InitializeVertexBuffer()
    {
        glGenBuffers(1, &vertexTexcoordPositionsBufferObject);
    
        glBindBuffer(GL_ARRAY_BUFFER, vertexTexcoordPositionsBufferObject);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertexTexcoordPositions),vertexTexcoordPositions, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    }
    
    void installShaders(void)
    {
    	char *vertexShader = NULL;
    	char *fragmentShader = NULL;
    
    	GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
    	GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
    
    	vertexShader = textFileRead("vertex.txt");
    	fragmentShader = textFileRead("fragment.txt");
    
    	const char * cvertex = vertexShader;
    	const char * cfragment = fragmentShader;
    
    	glShaderSource(vertex, 1, &cvertex, NULL);
    	glShaderSource(fragment, 1, &cfragment, NULL);
    
    	free (vertexShader);
    	free (fragmentShader);
    
    	glCompileShader(vertex);
    	printProgramInfoLog(vertex);
    	glCompileShader(fragment);
    	printProgramInfoLog(fragment);
    
    	program = glCreateProgram();
    
    	glAttachShader(program, vertex);
    	glAttachShader(program, fragment);
    
    	glLinkProgram(program);
    
    	vertexLoc  = glGetAttribLocation(program,  "position");    // Position de Variable "position" im Vertexshader finden
        texCoord0Loc  =glGetAttribLocation (program,  "texcoord"); // Position de Variable "texcoord" im Vertexshader finden
    
    	printProgramInfoLog(program);	
    
    }
    
    int DrawGLScene(GLvoid)									
    {								
    
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	glUseProgram(program);                              //Shader Programm verwenden
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);	
    
    	glBindBuffer(GL_ARRAY_BUFFER, vertexTexcoordPositionsBufferObject);
    	glEnableVertexAttribArray(0);
    	glVertexAttribPointer(vertexLoc, 4, GL_FLOAT, GL_FALSE, sizeof(float)*6, BUFFER_OFFSET(0));
        glVertexAttribPointer(texCoord0Loc , 2, GL_FLOAT, GL_FALSE,sizeof(float)*6, BUFFER_OFFSET(sizeof(float)*4));
    
    	glDrawArrays(GL_TRIANGLES, 0, 3);
    
    	glDisableVertexAttribArray(0);
    
    return 1;
    }
    
    //Vertexshader
    #version 330
    
    in vec4 position;			//eingehende Variable
    in vec2 texcoord;			//eingehende Variable
    out vec2 mytexcoord;		//ausgehende variable
    void main()
    {
        gl_Position = position;
        mytexcoord = texcoord;         //Nur zur Interpolation weiterreichen an den Fragmentshader
    }
    
    //Fragmentshader
    #version 330
    
    in vec2 mytexcoord;
    out vec4 outputColor;
    uniform sampler2D testTexture;
    void main()
    {
    
       outputColor = texture2D(testTexture,mytexcoord);
    }
    

    Das Problem ist, dass das Dreieck komplett nur eine Farbe hat.
    (Wohl die bei Texturcoordinaten (0,0))

    Die Textur wird aber vernünftig geladen, denn wenn ich im Fragmentshader die "mytexcoord" zum Test auf eine Festen Wert (x,y) mit 0<x<1 und 0<y<1 setze bekomme ich die entsprechende Farbe an der Stelle der Textur (natürlich für das gesamte Dreieck, was bei einem fsten Wert im Fragmentshader klar ist)

    Es scheint aber auch bei der verwendung von "mytexcoord" im Fragmentshader dort immer der selbe Wert drin zu sein: (0,0).

    Der Fehler kann in meinem Programm, im Vertex oder Fragmentshader sein. Aber ich vermute, dass ich einen Fehler bei der Verwendung des Vertexbufferobjektes gemacht habe, möglicherweise bei "glVertexAttribPointer" in "DrawGLScene".

    Warum bekomme ich immer nur eine Farbe bei meinem Dreieck?



  • Ich habe das Problem gefunden.

    Es muss einfach nur

    glEnableVertexAttribArray(1);
    ...
    
    glDisableVertexAttribArray(1);
    

    in die DrawGLScene eingefügt werden.


Anmelden zum Antworten