this post पर बेसिंग, मैं यह पता लगाने की कोशिश कर रहा था कि हास्केल में वीबीओ का उपयोग कैसे करें।ओपनजीएल वीबीओ हास्केल
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
पूर्ण कोड here पा सकते हैं, मामले में आप की जरूरत है: मैं बिट्स कि वहाँ कवर नहीं कर रहे थे में भरने की कोशिश की।
master branch पर, वही कार्य Sprites
खींचने के लिए सामान्य vertex
कॉल का उपयोग करता है और यह पूरी तरह से काम करता है। लेकिन वीबीओ का उपयोग करके, स्प्राइट बस वहां नहीं है; मुझे एक खाली स्क्रीन मिलती है।
क्या कोई मुझे बता सकता है कि मैंने यहां क्या किया है?
क्या आप हमें समझा सकते हैं कि पहले स्थान में क्या गलत है? क्या यह संकलित और दुर्व्यवहार करता है? –
@ थॉमसएम। डूबुइसन: ओह हाँ, क्षमा करें। यह पूरी तरह से संकलित है, लेकिन स्क्रीन खाली बनी हुई है। स्प्राइट दिखाई नहीं देता है - और इसे उपरोक्त वीबीओ भाग में होना चाहिए क्योंकि वीबीओ के बिना वही काम करता है। – Lanbo