如上所述:我如何使用與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提供您要找的內容?無論如何,我相信它應該。