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()
EndAnd 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()
EndThe 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 |


