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.
-
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 mussIch 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.