Multitexturing with VBO/VertexArrays
BlitzMax Forums/OpenGL Module/Multitexturing with VBO/VertexArrays
| ||
Hi! layer0.png: layer1.png: My problem is, that Multitexturing dont work with VertexBufferObjects or VertexArrays. Here the code that work correctly: 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 While Not KeyDown(KEY_ESCAPE) ; Wend bglDeleteContext() End And here the code for VBO: 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 glClientActiveTexture(GL_TEXTURE0) glBindBufferARB(GL_ELEMENT_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 glClientActiveTexture(GL_TEXTURE1) glBindBufferARB(GL_ELEMENT_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 While Not KeyDown(KEY_ESCAPE) ; Wend bglDeleteContext() End The first code display out this: But the second code with VBO only the second layer (layer1.png) I don't know why oO cu olli Edit: Now it works! You must use glClientActiveTetxure AND glActiveTexture ! |
| ||
oh |