首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SDL-image加载OpenGL图像

使用SDL-image加载OpenGL图像
EN

Stack Overflow用户
提问于 2011-03-26 23:22:15
回答 2查看 1K关注 0票数 1

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

有没有办法不用C语言就能得到图像数据?我甚至会雇佣一些其他的库,只要它支持PNG、JPG和TGA。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-27 07:06:04

为了使这与SDL alias & Haskell绑定一起工作,它使用surfaceGetPixels,它返回Pixels,这是Ptr PixelData的一个类型别名,PixelData是一个空的数据声明。之所以这样,是因为SDL表面像素格式和每像素的位数几乎可以是任何值。所以基本上,如果你有32bpp的格式,你会使用castPtr将指针转换为Ptr Word32

下面是一个获取/放置像素的示例:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-03-26 23:39:49

也许Codec.Image.DevIL能提供你想要的东西?我相信无论如何都应该是这样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5443259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档