【发布时间】:2015-02-06 15:41:25
【问题描述】:
我正在尝试将图像加载到 OpenGL 纹理中。
我创建了一个窗口和 GL 4.4 Core Forward-Compatible 上下文:
这是我用来加载图像和创建纹理的代码:
load :: IO ()
load = do
image <- JP.readImage "image.png"
case image of
(Left err) -> do print err
exitWith (ExitFailure 1)
(Right imgData) -> do
a <- malloc
glGenTextures 1 a
texId <- peek a
free a
loadImgIntoTexture texId imgData
loadImgIntoTexture texId (JP.ImageRGBA8 (JP.Image width height dat)) = do
glBindTexture GL_TEXTURE_2D texId
unsafeWith dat $ glTexImage2D GL_TEXTURE_2D 0 GL_RGBA (fromIntegral width) (fromIntegral height) 0 GL_RGBA GL_UNSIGNED_BYTE . castPtr
--p <- mallocBytes $ (fromIntegral width) * (fromIntegral height) * 4
--glTexImage2D GL_TEXTURE_2D 0 GL_RGBA (fromIntegral width) (fromIntegral height) 0 GL_RGBA GL_UNSIGNED_BYTE (castPtr p)
print "everything ok"
注释掉的行是另一种尝试将任何有意义的东西放入该纹理中。
这是 gDebugger 报告的纹理信息:
这是它显示的纹理内容:
当我打印出 JuicyPixels 返回的结构时,它会打印出不同的字节序列,这些字节序列肯定不会产生平面图像。
在这个例子中,我没有渲染纹理,而是使用gl 包生成的原始绑定。使用OpenGL 包时,我的行为完全相同(具有相同的蓝绿色)。不出所料,它在屏幕上呈现为平面矩形。
我尝试过使用不同的图像,尺寸为 128x128 和 NPOT(屏幕截图中为 100x100)。
什么可能导致这种行为?
【问题讨论】:
-
致以“没有明确的问题陈述/缺少代码”的方式关闭它的人 - 代码链接为 Gist,因为 Q 已经太长了,并且 gist 中的部分与手头的问题;它们只是为了方便而呈现。至于声明,我认为很明显我没有加载只有青色的PNG,呵呵。
-
从什么时候开始,
N/A在常规 2D 纹理上是GL_TEXTURE_MIN_FILTER的合理值?你确定这不仅仅是 gDEBugger 愚蠢吗?或者它把N/A放在那里是因为你的缩小过滤器包括mipmapping,但是你的纹理LOD数量是错误的? -
你试过查看 glGetError 的输出吗?
-
@Mokosha 我总是将 gDebugger 设置为中断错误。
标签: opengl haskell juicy-pixels