Загрузка изображения OpenGL с помощью SDL-изображения

StackOverflow https://stackoverflow.com/questions/5443259

  •  12-11-2019
  •  | 
  •  

Вопрос

Как сказано выше:Как я могу использовать средства загрузки изображений 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 предоставляет то, что вы ищете?Я верю в это должен в любом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top