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?
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? –
@ 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