2013-04-03 37 views
5

Căn cứ vào this post, tôi đã cố gắng tìm ra cách sử dụng VBO trong Haskell. Tôi đã cố gắng lấp đầy các bit không được che phủ ở đó:OpenGL VBO trong Haskell

data Sprite = Sprite { spriteImage :: Image 
        , spritePosition :: Position 
        } deriving (Show, Eq) 

spriteBatch :: [Sprite] -> [(TextureObject, [Sprite])] 
spriteBatch = (map f) . toList . (groupedBy (imageTexture . spriteImage)) 
    where f (t, s) = (t, s) 

offset = plusPtr nullPtr 

renderSprites :: [Sprite] -> IO() 
renderSprites l = (flip mapM_) (spriteBatch l) $ \(t, sps) -> do 
     textureBinding Texture2D $= Just t 
     let l = concat $ map sprToList sps 
     vbo <- vboOfList ((length l)*4) l 
     displayVbo vbo $ fromIntegral $ length sps 
    where 
     sprToList :: Sprite -> [GLfloat] 
     sprToList (Sprite (Image _ (TexCoord2 u0 v0) (TexCoord2 u1 v1) (Size w h) _) (Position x y)) = 
      [fromIntegral x, fromIntegral y, u0, v0 
      ,fromIntegral (x+w), fromIntegral y, u1, v0 
      ,fromIntegral (x+w), fromIntegral (y+h), u1, v1 
      ,fromIntegral x, fromIntegral (y+h), u0, v1 
      ] 

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

displayVbo buff size = do 
    let stride = 2*(2*4) 
     vxDesc = VertexArrayDescriptor 2 Float stride $ offset 0 
     texCoo = VertexArrayDescriptor 2 Float stride $ offset 8 
    bindBuffer ArrayBuffer $= Just buff 

    arrayPointer VertexArray $= vxDesc 
    arrayPointer TextureCoordArray $= texCoo 

    clientState VertexArray $= Enabled 
    clientState TextureCoordArray $= Enabled 

    drawArrays Quads 0 size 
    bindBuffer ArrayBuffer $= Nothing 

Bạn có thể tìm mã đầy đủ here, trong trường hợp bạn cần.

Trên master branch, chức năng rất giống nhau sử dụng các cuộc gọi vertex bình thường để rút ra Sprites và hoạt động hoàn hảo. Nhưng sử dụng VBO's, sprite không có ở đó; Tôi có một màn hình trống.

Có ai có thể giải thích cho tôi những gì tôi đã làm sai ở đây không?

+1

Bạn có thể giải thích cho chúng tôi điều gì sai ở địa điểm đầu tiên không? Nó có biên dịch và hành vi sai trái không? –

+0

@ ThomasM.DuBuisson: Ồ vâng, xin lỗi. Nó biên dịch hoàn hảo, nhưng màn hình vẫn trống. Các sprite không hiển thị - và nó có được trong phần VBO ở trên vì cùng mà không có VBO hoạt động tốt. – Lanbo

Trả lời

1

Bạn đang sử dụng một bộ đệm cho các đỉnh và các tia cực tím. Sử dụng hai bộ đệm, một cho các đỉnh và một cho uv.

Các vấn đề liên quan