我正在尝试将图像加载到 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
包生成的原始绑定。使用 package.json 时,我的行为完全相同(具有相同的蓝绿色)OpenGL
。不出所料,它在屏幕上呈现为一个平面矩形。
我尝试过使用不同的图像,尺寸为 128x128 和 NPOT(如屏幕截图所示为 100x100)。
什么可能导致这种行为?
完整源码。