V
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()
End
Also 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 drin
Und ein weiteren:
TriangleBuffer: Hier stehen die Vertexindices drin
Mit
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()
End
Layer 0:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/ExwGK45113277191054_layer0.png
Layer 1:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/XlSnG65622991047031_layer1.png
Mit glMultiTexCoord2f:
http://www.sucox.art-fx.org/BlitzPastingv2/uploads/useruploads/RbiOW36111698927844_multitex.png
Mit 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