OpenGL 纹理未按定义显示

Posted

技术标签:

【中文标题】OpenGL 纹理未按定义显示【英文标题】:OpenGL texture not appearing as defined 【发布时间】:2014-02-25 05:10:07 【问题描述】:

我正在设置一个硬编码纹理以用作我的 OpenGL 应用程序的调试纹理。定义它的函数是:

void Texture::initDebugTexture(void)

    unsigned char pixels[] = 
        255, 0, 255,
        0, 255, 255,
        255, 0, 255,
        0, 255, 255
    ;

    debug.loadPixels(2, 2, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    debug.setFiltering(GL_LINEAR_MIPMAP_LINEAR, GL_NEAREST);

loadPixels 扩展为:

void Texture::loadPixels(int width, int height, GLenum colorFormat, GLenum type, void* pixels)

    clean();

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);

    glTexImage2D(GL_TEXTURE_2D, 0, colorFormat, width, height, 0, colorFormat, type, pixels);
    glGenerateMipmap(GL_TEXTURE_2D);

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

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

setFiltering 很简单:

void Texture::setFiltering(GLenum filterMin, GLenum filterMag, float aniso = 0.0f)

    bind();
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMin);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMag);
    if (aniso != 0.0f)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);

initDebugTexture 中,我尝试使用洋红色/青色方格图案创建一个简单的 2x2 纹理,这样它就不会被误认为是真正的纹理。不幸的是,这不是发生的事情,而是我得到了这个:

这里发生了什么?那个桃色的部分很奇怪,哪里来的?

【问题讨论】:

你的u/vs 是什么?当您使用重复的纹理时会发生什么,例如u/vs 从 0.0 到 4.0?是否禁用了自动生成 mipmap?你有任何 GL 错误吗?如果您以不同方式指定每个像素(红、蓝、绿、灰)会怎样? 当我将颜色设置为 [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] 时,我结束up with:左上象限为白色,右上象限为青色,左下象限为红色,右下象限为绿色。当我将 uv 的范围设置为 0 到 4 而不是 0 到 1 时,它按预期缠绕了 4 次。 我认为它以错误但始终错误的颜色环绕 4 次。显然颜色是混合的。可能在glTexImage2D 步骤中。你试过GL_RGBA吗? pixels 的阅读顺序是否与您预期的不同?还是越界? 对于它的价值,您的pixels 数组不会产生棋盘格 - 它会产生洋红色条纹和青色条纹。您需要交换 2 个像素。 尝试将内部格式显式设置为 GL_RGBA8,而不是对两个值都使用 colorFormat 参数。此外,请确保在初始化纹理后解除绑定。如果您将其绑定,则其他方法可能会使用纹理功能并对其产生影响。 【参考方案1】:

虽然你已经提到你是如何在 cmets 中解决这个问题的,但我想我可以在这里解释一下出了什么问题:

我忽略了对齐。默认情况下,GL 期望每一行在 4 字节边界上对齐,因此 GL 实际读取的数据不是您所期望的,并且

[255, 0, 255], [0, 255, 255], [255,0,255], [0,255,255] 

成为

[255, 0, 255], [0, 255, 255], ___ ___ [255, 0, 255] [255, U, U] 

U表示未定义)。

要么将数据正确对齐到 GL 的预期,要么通过 glPixelStore 设置 GL_UNPACK_ALIGNMENT

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

在指定纹理数据之前。

【讨论】:

以上是关于OpenGL 纹理未按定义显示的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 纹理显示不正确(夹紧?)

opengl - 只显示一个纹理

OpenGL 纹理 DSA 不显示纹理

OpenGL + QT:渲染到纹理并显示回来

OpenGL 2D纹理无法正确显示c ++

无法使用 OpenGL 显示纹理