Загрузка изображения OpenGL с помощью SDL-изображения
Вопрос
Как сказано выше:Как я могу использовать средства загрузки изображений SDL-образ привязка к Haskell для загрузки OpenGL текстура, как вы это часто делаете в C.SDL-образ поддерживает множество форматов изображений, но обеспечивает только Surface
тип данных.Для glTexImage2D
, кажется, мне нужно предоставить что-то другое, а PixelData
тип данных.
Есть ли способ получить данные изображения, не прибегая к C?Я бы даже использовал какую-нибудь другую библиотеку, если бы она поддерживала PNG, JPG и TGA.
Решение
Чтобы это работало с поверхностями 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 для загрузки текстуры.
Другие советы
Возможно Codec.image.devil предоставляет то, что вы ищете?Я верю в это должен в любом случае.