[Haskell-cafe] OpenGL's VBO with Haskell

Twinside twinside at gmail.com
Mon Aug 25 13:43:17 EDT 2008


Hi Haskell list,

Today I'm turning to you for the use of VBO (Vertex Buffer Object) in
Haskell. I seem
to be able to create one without any problem using the following code :

------------------------------------------------------
vboOfList :: Int -> [Float] -> IO BufferObject
vboOfList size elems =
    let ptrsize = toEnum $ size * 4
        arrayType = ElementArrayBuffer
    in do
    [array] <- genObjectNames 1
    bindBuffer arrayType $= Just array
    arr <- newListArray (0, size - 1) elems
    withStorableArray arr (\ptr -> bufferData arrayType $= (ptrsize, ptr,
StaticDraw))
    bindBuffer ArrayBuffer $= Nothing
    reportErrors
    return array
------------------------------------------------------

However the problem arise when I try to draw primitives using this vbo :

------------------------------------------------------
displayVbo buff size = do
    let stride = toEnum sizeOfVertexInfo
        vxDesc = VertexArrayDescriptor 3 Float stride $ offset 0
        colors = VertexArrayDescriptor 4 Float stride $ offset 12
        texCoo = VertexArrayDescriptor 2 Float stride $ offset (12 + 16)
        filt   = VertexArrayDescriptor 4 Float stride $ offset (12 + 16 + 8)
    bindBuffer ArrayBuffer $= Just buff

    arrayPointer VertexArray $= vxDesc
    arrayPointer ColorArray $= colors
    arrayPointer TextureCoordArray $= texCoo
    arrayPointer SecondaryColorArray $= filt

    drawArrays Quads 0 size
    bindBuffer ArrayBuffer $= Nothing
------------------------------------------------------

Nothing is displayed on screen.

As you can see, my VBO contain interleaved data :
- 3 float for the vertex
- 4 for the color
- 2 for the texture coordinate
- 4 for the secondary color)

The 'offset' function has type Int -> Ptr Float, and is used to forge a
pointer from an Int, to mimic
the C way of using VBO. As far as I've checked, the values in my list for
VBO generation are valid and well
displayed using other techniques.

So is there a workaround other method for my solution, preferably by keeping
my data interleaved?
Secondly,  is there any sample for advanced features like VBOs in Haskell?

Regards,
Vincent




More information about the Haskell-Cafe mailing list