Загрузка изображения OpenGL с SDL-изображением - PullRequest
1 голос
/ 26 марта 2011

Как сказано выше: Как я могу использовать средства загрузки изображений привязки SDL-image к Haskell, чтобы загрузить текстуру OpenGL , как вы часто делаете в C. SDL-изображение поддерживает множество форматов изображений, но предоставляет только тип данных Surface. Кажется, для glTexImage2D мне нужно предоставить что-то другое, тип данных PixelData.

Есть ли способ получить данные изображения, не прибегая к C? Я бы даже использовал какую-нибудь другую библиотеку, если она дает мне поддержку PNG, JPG и TGA.

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

Для этой работы с поверхностями SDL и привязками Haskell используйте surfaceGetPixels, он возвращает Pixels, который является псевдонимом типа для Ptr PixelData, а PixelData - пустое объявление данных.Причина в том, что поверхностный пиксельный формат SDL и количество бит на пиксель могут быть практически любыми.Таким образом, в основном, если у вас есть формат 32bpp, вы должны привести указатель Ptr Word32, используя 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

Таким же образом вы можете привести указатель к определенному типу указателя и передать его glTexImage2D для загрузки текстуры.

1 голос
/ 26 марта 2011

Возможно Codec.Image.DevIL обеспечивает то, что вы ищете? Я верю, что должно все равно.

...