OpenGL VBO-Texturkoordinaten



  • Hallo zusammen, nach über 11 Jahren möchte ich wieder mal was mit OpenGL erstellen und scheitere im Moment beim VBO an der korrekten übergabe/kennzeichnung meines Texturkoordinaten-Arrays.

    Das Problem äußert sich dadurch dass ich nur den unteren linken Pixel der Textur sehe, so als wären keine Koordinaten angegeben. (die Textur ist ok)

    Ich habe mal alles relevante extrahiert und poste es hier da ich mir nicht mehr zu helfen weiß, ich denke ich übersehe einfach eine "Kleinigkeit" aber sehe im Moment den Wald vor lauter Bäumen nicht mehr.
    Was mache ich da falsch?

    struct CVector
    {
    	float x, y, z;
    };
    
    struct CTexCoord
    {
    	float u, v;
    };
    
    int main(int argc, char* argv[])
    {
    	// window & OGL-Context setup
    
    	GLuint textureId = loadTexture();	// die textur ist ok, sehe ich an anderer stelle..
    
    	int nVerts = 4;
    	int nCoords = 4;
    	GLuint vaoId, vboId, uvBoId;
    	CVector *verts = new CVector[nVerts];
    	CTexCoord *texCoords = new CTexCoord[nCoords];
    
    	verts[0].x = -0.5;	verts[0].y = -0.5;	verts[0].z = 0.0;	texCoords[0].u = 0; texCoords[0].v = 0;		// Bottom left corner
    	verts[1].x = -0.5;	verts[1].y = 0.5;	verts[1].z = 0.0;	texCoords[1].u = 0; texCoords[1].v = 1;		// Top left corner
    	verts[2].x = 0.5;	verts[2].y = -0.5;	verts[2].z = 0.0;	texCoords[2].u = 1; texCoords[2].v = 0;		// Bottom right corner
    	verts[3].x = 0.5;	verts[3].y = 0.5;	verts[3].z = 0.0;	texCoords[3].u = 1; texCoords[3].v = 1;		// Top Right corner
    
    	glGenVertexArrays(1, &vaoId);
    	glBindVertexArray(vaoId);
    
    	glGenBuffers(1, &vboId);
    	glBindBuffer(GL_ARRAY_BUFFER, vboId);
    	glBufferData(GL_ARRAY_BUFFER, nVerts * sizeof(CVector), verts, GL_STATIC_DRAW);
    	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    	glEnableVertexAttribArray(0);
    
    	glGenBuffers(1, &uvBoId);
    	glBindBuffer(GL_ARRAY_BUFFER, uvBoId);
    	glBufferData(GL_ARRAY_BUFFER, nCoords * sizeof(CTexCoord), texCoords, GL_STATIC_DRAW);
    	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    	glEnableVertexAttribArray(1);
    
      while(1)
      {
    	  glClear(GL_COLOR_BUFFER_BIT);
    
    	  	glActiveTexture(0);
    		glBindTexture(GL_TEXTURE_2D, textureId);
    
    		glBindVertexArray(vaoId);
    		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
    		glXSwapBuffers (display, win);
      }
    }
    


  • An den Shadern kann es auch nicht liegen? Sieht sonst ok aus.



  • Hi,
    bis jetzt verwende ich noch keinerlei Shader, nirgendwo im programm. (wäre mein nächster Schritt..)
    Kann es daran liegen? Ich dachte standardmäßig wird immernoch die "fixed-Pipeline" genutzt?

    Ist schon irgendwie traurig welch Wirr-Warr aus der API wurde, hoffe Vulkan wird bald fertig.



  • Ok, da ist dein Problem. Shader sind halt unerlässlich (für modernes GL), um überhaupt irgendwas zu zeichnen. Denn fixed function pipeline wird halt nur genutzt, wenn du die entsprechende API benutzt, etwa glVertexPointer , glTexCoordPointer , etc. Von daher scheint es mit deiner Info so, als ob dir eben lediglich die Shaderprogramme fehlen zu deinem Code.


  • Mod

    eigentlich sollte das auch ohne shader funzen.
    hast du beim setup backface culling oder zbuffer oder sowas eingeschaltet?



  • So, danke erstmal für eure Antworten.
    Ich habe mittlerweile Shader eingebaut und das eigentliche Problem damit gelöst.

    @ rapso
    als ich ganz am Anfang noch testweise mit glBegin()/glEnd() gerendert habe hatte ich die Textur schonmal drauf, backface culling war aus, Z-Buffer hab ich nicht angerührt, ka warums mit dem VAO nicht mehr ging.

    Nun klappts jedenfalls aber jetzt habe ich ein Problem mit den Textur-Koordinaten an sich, habe von früher in Erinnerung dass U=X und V=Y ist und 0, 0 dem linken unteren Eck der Textur entspricht, nun habe ich unterschiedliche beschreibungen gefunden, u.A. welche nach denen
    - 0, 0 das obere linke Eck sei,
    - man texturen vertikal spiegeln muss

    Ich bin nun schon wieder verwirrt, ich arbeite immer noch mit den Arrays aus meinem 1 post und habe versucht meine Koordinaten den beschreibungen etsprechend einzutragen, bekomme es aber nicht gebacken die Textur sauber auszurichten. 🙄


Anmelden zum Antworten