2011-03-26 90 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提供您要找的內容?無論如何,我相信它應該