【问题标题】:Opengl texture not showingOpengl纹理不显示
【发布时间】:2017-05-06 17:24:56
【问题描述】:

我试图在 opengl 中显示一个简单的纹理(来自一个数组),但我只是得到一个空白屏幕。

我生成纹理的代码:

GLbyte textureData[] = { 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255 };
GLsizei width = 2;
GLsizei height = 2;


glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glGenTextures(1, &textureName);   
glBindTexture(GL_TEXTURE_2D, textureName); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_UNSIGNED_BYTE, GL_RGB8, (GLvoid*)textureData);

以及显示代码:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureName);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0.0, 0.0);
glVertex2f(-1.0, -1.0);

glTexCoord2f(1.0, 0.0);
glVertex2f(1.0, -1.0);

glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0, 1.0);

glTexCoord2f(1.0, 1.0);
glVertex2f(1.0, 1.0);
glEnd();

glutSwapBuffers();

我知道问题出在纹理上,因为我可以在屏幕上绘制实体形状。

【问题讨论】:

    标签: c++ opengl graphics


    【解决方案1】:

    默认缩小过滤设置是使用 mipmap。由于您没有提供所有低至 1×1 的 mipmap 级别,并且没有切换到不需要 mipmap 的过滤器方法,因此将跳过纹理采样。

    您必须将过滤器方法设置为非 mipmapped,如下所示:

    glTexImage2D(…);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    

    或提供完整的图像级别堆栈。

    因评论而更新

    glTexImage2D 调用也存在问题:GL_RGB8 不是数据格式的有效标记。只有 internal 格式才允许显式大小的格式标记。但是,对于初学者来说,您可能应该使用未调整大小的标记(只是 GL_RGB 没有 8)(仅在真正重要时才应使用显式大小,例如,为了某些精度要求或避免流式传输纹理更新的转换成本) .

    【讨论】:

    • 我添加了您建议的行(以及另一个用于放大的行),但不幸的是仍然只显示白屏。
    • @acernine:啊,我看到了另一个问题。 GL_RGB8 不是数据格式的有效枚举。
    • @datenwold 抱歉,我对此很陌生,我相信您能看出来!我的印象是源纹理和目标纹理都是 RGB8 - 为什么不是这种情况?
    • @acernine:数据的大小和布局完全由formattype 参数确定。 internal_format 参数过去只是 OpenGL 的第一个版本(20 年前)中的通道数(1、2、3 或 4),但随着时间的推移,需要对内部格式进行更多控制,因此需要额外的标记。但是对于数据缓冲区,伴随它的两个参数提供了更好的控制。因此,它本质上归结于 API 设计中的遗留问题和错失的机会。事后看来是 20/20。
    • @acernine:你(不小心?)交换了typeinternal_format。为了您的方便:pastebin.com/Ch7TanK9
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多