1

我正在尝试将图像加载到 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)。

什么可能导致这种行为?

完整源码

4

2 回答 2

1

这很可能是 gDEBUgger 中的错误。经过一些操作并实际绘制纹理后,我已经验证它确实包含正确的数据。

于 2015-02-10T17:44:41.980 回答
0

将功能强大的 Haskell 与 OpenGL(混乱状态的典型代表)相结合,充其量只是一个模糊的过程,因此我承认对于这种确切的场景有点过头了。

然而,众所周知,如果没有与数据匹配的缩小过滤器和放大过滤器,OpenGL 纹理是不完整的(参见此处)。我在代码中没有看到这样的,所以你的纹理不完整。在 C 中,您将添加如下内容:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

正如评论中所指出的,这可能不应该导致 gDEBugger 提供虚假输出;浏览文档,我没有看到任何需要完整的纹理才能从中读取的内容(并且 gDEBugger 通过拦截 GL 调用来工作)。尽管如此,从带有不匹配的采样过滤器的纹理中读取对我来说是错误的。如果这是一个边缘案例,我不会感到惊讶。

于 2015-02-07T06:23:25.973 回答