使用SDL图像加载OpenGL图像

时间:2011-03-26 15:22:15

标签: opengl haskell sdl-image

如上所述:我如何使用SDL-image绑定到Haskell的图像加载工具来加载OpenGL纹理,就像你经常在C中做的那样.SDL-image支持很好各种图像格式,但只提供Surface数据类型。对于glTexImage2D,似乎我需要提供一些不同的PixelData数据类型。

如何在不诉诸C的情况下获取图像数据?我甚至会使用其他一些库,只要它能给我PNG,JPG和TGA支持。

2 个答案:

答案 0 :(得分:2)

使用SDL曲面&amp; Haskell绑定使用surfaceGetPixels它返回PixelsPtr PixelDataPixelData的类型别名,Ptr Word32是空数据声明。之所以这样,是因为SDL表面像素格式&amp;每个像素的位数几乎可以是任何东西。所以基本上如果你有32bpp格式,你可以使用castPtr将指针指向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

以下是获取/放置像素的示例:

{{1}}

所以类似地你可以将指针强制转换为特定的指针类型并将其提供给glTexImage2D来上传纹理。

答案 1 :(得分:1)

也许Codec.Image.DevIL提供了您正在寻找的内容?无论如何,我相信应该