Probleme beim Texturemapping bei GLSL [gelöst]
-
Hi,
nachdem ich diese Seite
http://www.c-plusplus.net/forum/285147vor 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.