【问题标题】:OpenGL Immediate Mode textures not workingOpenGL立即模式纹理不起作用
【发布时间】:2015-12-13 22:05:31
【问题描述】:

我正在尝试使用即时模式纹理构建一个简单的项目。 不幸的是,当我渲染时,显示的是 GL 颜色而不是纹理。我四处寻找解决方案,但发现在线示例和我的代码之间没有有意义的区别。

我已将其简化为一个最小的失败示例,我在此处提供了该示例。如果我的理解是正确的,这应该会产生一个带有黑色、红色、绿色和蓝色角的带纹理的四边形。不幸的是,它看起来是紫色的,好像它完全忽略了纹理。我做错了什么?

#include <glut.h>

GLuint tex;

void displayFunc() {
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, tex);
    glBegin(GL_TRIANGLE_STRIP);
    glColor3f(0.5, 0, 1);
    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();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Test");
    glutDisplayFunc(displayFunc);

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

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB8, GL_UNSIGNED_BYTE, (GLvoid*)textureData);

    glutMainLoop();
}

输出:

也可能值得一提:

我正在 Mac 上构建这个项目(运行 El Capitan 10.11.1)

显卡:NVIDIA GeForce GT 650M 1024 MB

【问题讨论】:

  • 除了 Reti Koradi 的回答之外,您的纹理也不是 mipmap 完整的。您应该通过glTexParameteri 将纹理缩小过滤器显式设置为GL_LINEARGL_NEAREST
  • @derhas 谢谢!我需要这个和 Reti Koradi 的答案来修复它。

标签: macos opengl immediate-mode


【解决方案1】:

您向glTexImage2D() 传递了一个无效参数。 GL_RGB8 不是第 7 个 (format) 参数支持的值之一。正确的值为GL_RGB

大小格式,如GL_RGB8,用于internalFormat 参数。在这种情况下,该值定义了用于纹理内部存储的组件数量和每个组件的大小。

formattype 参数定义了你传入的数据。对于这些,format 只定义了组件的数量,而type 定义了每个组件的类型和大小。

当您的 OpenGL 代码出现问题时,请务必致电 glGetError() 来检查错误。在这种情况下,您会看到由您的glTexImage2D() 调用引起的GL_INVALID_ENUM 错误。

【讨论】:

  • 谢谢!这与 derhass 的评论一起修复了它。
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2013-04-21
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多