2011-03-26 64 views
1

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

任何方式获取图像数据而不诉诸C?我甚至会雇佣其他图书馆,只要它给我PNG,JPG和TGA支持。

回答

2

为了与SDL这项工作表面&哈斯克尔绑定使用surfaceGetPixels返回Pixels这是Ptr PixelDataPixelData一个类型别名是一个空的数据声明。之所以这样做,是因为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上传的质感。

1

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