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()
    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 🙂


Anmelden zum Antworten