【问题标题】:Loading a OpenGL Image with SDL-image使用 SDL 图像加载 OpenGL 图像
【发布时间】:2011-03-27 07:06:03
【问题描述】:

正如上面所说:我如何使用 SDL-image 绑定到 Haskell 的图像加载工具来加载 OpenGL 纹理,就像您在 C 中经常做的那样。SDL-image 支持多种图像格式,但只提供Surface 数据类型。对于glTexImage2D,看来,我需要提供一些不同的东西,PixelData 数据类型。

有什么方法可以在不求助于 C 的情况下获取图像数据?我什至会使用其他库,只要它支持 PNG、JPG 和 TGA。

【问题讨论】:

    标签: opengl haskell sdl-image


    【解决方案1】:

    要使这项工作与 SDL 表面和 Haskell 绑定一起使用,请使用 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 以上传纹理。

    【讨论】:

      【解决方案2】:

      也许Codec.Image.DevIL 提供了您正在寻找的东西?我相信它应该反正。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多