如上所述:我如何使用与Haskell绑定的SDL-image绑定的图像加载设施来加载OpenGL纹理,就像您在C中经常做的那样。SDL-image支持一个很好的各种图像格式,但只提供Surface
数据类型。对于glTexImage2D
,看来,我需要提供一些不同的数据类型,即PixelData
。加载SDL图像的OpenGL图像
任何方式获取图像数据而不诉诸C?我甚至会雇佣其他图书馆,只要它给我PNG,JPG和TGA支持。
如上所述:我如何使用与Haskell绑定的SDL-image绑定的图像加载设施来加载OpenGL纹理,就像您在C中经常做的那样。SDL-image支持一个很好的各种图像格式,但只提供Surface
数据类型。对于glTexImage2D
,看来,我需要提供一些不同的数据类型,即PixelData
。加载SDL图像的OpenGL图像
任何方式获取图像数据而不诉诸C?我甚至会雇佣其他图书馆,只要它给我PNG,JPG和TGA支持。
为了与SDL这项工作表面&哈斯克尔绑定使用surfaceGetPixels
返回Pixels
这是Ptr PixelData
和PixelData
一个类型别名是一个空的数据声明。之所以这样做,是因为SDL表面像素格式每个像素的位数可能几乎是任何东西。所以基本上,如果你有32bpp格式,你可以使用castPtr
来指示Ptr Word32
。
这里是获取/把一个像素的例子:
getPixel32 :: MonadIO m => Surface -> Int -> Int -> m Pixel
getPixel32 s x y = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
Pixel `liftM` peekElemOff (castPtr ps :: Ptr Word32) offset
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
setPixel32 :: MonadIO m => Surface -> Int -> Int -> Pixel -> m()
setPixel32 s x y (Pixel pixel) = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
所以同样,你可以将指针转换为特定的指针类型,把那个给glTexImage2D上传的质感。
也许Codec.Image.DevIL提供您要找的内容?无论如何,我相信它应该。