OpenGL: Multitexturing mit VBOs geht nicht (Erledigt)
-
Hi!
Problem ist, dass ich glMultiTexCoord2f nicht mit VertexBufferObjects richtig umsetzen kann.
Der gefilterte Code:
Strict Global Pixmap : TPixmap Global Layer0 : Int Global Layer1 : Int Global VertexBuffer : Int[3] Global Vertices : TBank[3] Global TriangleBuffer : Int Global Triangles : TBank bglCreateContext(640, 480, 0, 0, BGL_BACKBUFFER | BGL_DEPTHBUFFER) ' Init GlewInit() glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ' Textures Pixmap = LoadPixmap("layer1.png") Layer0 = bglTexFromPixmap(Pixmap) Pixmap = LoadPixmap("layer2.png") Layer1 = bglTexFromPixmap(Pixmap) Pixmap = Null ' Generate 3 VBOs glGenBuffersARB(3, VertexBuffer) ' Vertex-Coords Vertices[0] = CreateBank(12*4) Vertices[0].PokeFloat( 0, -0.5) ; Vertices[0].PokeFloat( 4, 0.5) ; Vertices[0].PokeFloat( 8, 0.0) Vertices[0].PokeFloat(12, 0.5) ; Vertices[0].PokeFloat(16, 0.5) ; Vertices[0].PokeFloat(20, 0.0) Vertices[0].PokeFloat(24, 0.5) ; Vertices[0].PokeFloat(28, -0.5) ; Vertices[0].PokeFloat(32, 0.0) Vertices[0].PokeFloat(36, -0.5) ; Vertices[0].PokeFloat(40, -0.5) ; Vertices[0].PokeFloat(44, 0.0) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[0]) glBufferDataARB(GL_ARRAY_BUFFER, 12*4, Vertices[0].Buf(), GL_STATIC_DRAW) ' Vertex-UV0-Coords Vertices[1] = CreateBank(8*4) Vertices[1].PokeFloat( 0, 0.0) ; Vertices[1].PokeFloat( 4, 0.0) Vertices[1].PokeFloat( 8, 1.0) ; Vertices[1].PokeFloat(12, 0.0) Vertices[1].PokeFloat(16, 1.0) ; Vertices[1].PokeFloat(20, 1.0) Vertices[1].PokeFloat(24, 0.0) ; Vertices[1].PokeFloat(28, 1.0) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[1]) glBufferDataARB(GL_ARRAY_BUFFER, 12*4, Vertices[1].Buf(), GL_STATIC_DRAW) ' Vertex-UV1-Coords Vertices[2] = CreateBank(8*4) Vertices[2].PokeFloat( 0, 0.0) ; Vertices[2].PokeFloat( 4, 0.0) Vertices[2].PokeFloat( 8, 1.0) ; Vertices[2].PokeFloat(12, 0.0) Vertices[2].PokeFloat(16, 1.0) ; Vertices[2].PokeFloat(20, 1.0) Vertices[2].PokeFloat(24, 0.0) ; Vertices[2].PokeFloat(28, 1.0) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[2]) glBufferDataARB(GL_ARRAY_BUFFER, 12*4, Vertices[2].Buf(), GL_STATIC_DRAW) ' Generate 1 VBO glGenBuffersARB(1, Varptr(TriangleBuffer)) ' Triangle-Vertex-Indices Triangles = CreateBank(2*12) Triangles.PokeInt( 0, 0) ; Triangles.PokeInt( 4, 1) ; Triangles.PokeInt( 8, 2) Triangles.PokeInt(12, 2) ; Triangles.PokeInt(16, 3) ; Triangles.PokeInt(20, 0) glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, TriangleBuffer) glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, 2*12, Triangles.Buf(), GL_STATIC_DRAW) ' Matrices glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0, 640.0/480.0, 1.0, 100.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0, 0.0, -3.0) ' Layer 0 glActiveTexture(GL_TEXTURE0) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[1]) glTexCoordPointer(2, GL_FLOAT, 0, Null) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer0) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) ' Layer 1 glActiveTexture(GL_TEXTURE1) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[2]) glTexCoordPointer(2, GL_FLOAT, 0, Null) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer1) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) ' Draw glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[0]) glVertexPointer(3, GL_FLOAT, 0, Null) glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, TriangleBuffer) glDrawElements(GL_TRIANGLES, 2*3, GL_UNSIGNED_INT, Null) ' Flip bglSwapBuffers() ' End WaitKey bglDeleteContext() EndAlso ich habe 3 VBO-Buffer.
VertexBuffer[0]: Hier stehen die Vertexpositionen drin
VertexBuffer[1]: Hier stehen die Vertex-UV-Koordinaten für Texturelayer 0 drin
VertexBuffer[2]: Hier stehen die Vertex-UV-Koordinaten für Tetxurelayer 1 drinUnd ein weiteren:
TriangleBuffer: Hier stehen die Vertexindices drinMit
glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY)Erlaube ich, das er die Vertexpositionen und Tetxurkoordinaten aus dem Buffern entnehmen kann.
Jetzt zu Texturelayer 0:
glActiveTexture(GL_TEXTURE0) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[1]) glTexCoordPointer(2, GL_FLOAT, 0, Null) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer0) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)Und zu Texturelayer 2:
glActiveTexture(GL_TEXTURE1) glBindBufferARB(GL_ARRAY_BUFFER, VertexBuffer[2]) glTexCoordPointer(2, GL_FLOAT, 0, Null) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer1) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)Wie ihr sehen könnt, binde ich die Texturkoordinatenbuffer direkt nach glActiveTexture ein.
glEnableClientState(GL_TEXTURE_COORD_ARRAY) nach jedem glActiveTexture aufzurufen bringt ebenfalls nix.
Es wird immer nur Texturelayer 0 gezeichnet. Benutze ich statts glActiveTetxure glClientActiveTetxure, wird nur Texturelayer 1 gezeichnet.
Benutze ich den Spaß mit glMultiTexCoord2f, dann gehts perfekt oO
Strict Global Pixmap : TPixmap Global Layer0 : Int Global Layer1 : Int bglCreateContext(640, 480, 0, 0, BGL_BACKBUFFER | BGL_DEPTHBUFFER) ' Init GlewInit() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ' Textures Pixmap = LoadPixmap("layer1.png") Layer0 = bglTexFromPixmap(Pixmap) Pixmap = LoadPixmap("layer2.png") Layer1 = bglTexFromPixmap(Pixmap) Pixmap = Null ' Matrices glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0, 640.0/480.0, 1.0, 100.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0, 0.0, -3.0) ' Layer 0 glActiveTexture(GL_TEXTURE0) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer0) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) ' Layer 1 glActiveTexture(GL_TEXTURE1) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, Layer1) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) ' Draw glBegin(GL_TRIANGLES) glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0) glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0) glVertex3f(-0.5, 0.5, 0.0) glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0) glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0) glVertex3f(0.5, 0.5, 0.0) glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0) glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0) glVertex3f(0.5, -0.5, 0.0) glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0) glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0) glVertex3f(0.5, -0.5, 0.0) glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0) glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0) glVertex3f(-0.5, -0.5, 0.0) glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0) glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0) glVertex3f(-0.5, 0.5, 0.0) glEnd() ' Flip bglSwapBuffers() ' End WaitKey bglDeleteContext() EndLayer 0:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/ExwGK45113277191054_layer0.pngLayer 1:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/XlSnG65622991047031_layer1.pngMit glMultiTexCoord2f:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/RbiOW36111698927844_multitex.pngMit VBO:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/ExwGK45113277191054_layer0.png(Wo gibt es hier IMG-Tags?)
Danke schonmal für die Mühe!
mfg olli
Edit:
Lustigerweise muss man glClientActiveTexture UND glActiveTexture benutzen. So, das hat mich wieder heute 4 Stunden gekostet, aber Multitexturing geht nun perfekt in meiner Engine