Multitexturing with VBO/VertexArrays

BlitzMax Forums/OpenGL Module/Multitexturing with VBO/VertexArrays

Vertex(Posted 2005) [#1]
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 !


ImaginaryHuman(Posted 2005) [#2]
oh