无法将纹理绑定到 GL_QUADS

Posted

技术标签:

【中文标题】无法将纹理绑定到 GL_QUADS【英文标题】:Can't bind a texture to a GL_QUADS 【发布时间】:2020-01-24 12:13:42 【问题描述】:

我尝试在 OpenGL 中制作动画,我的顶点和动画都可以正常工作,但我想为其添加背景图像,并带有诸如 bmp 之类的文件或其他文件。

所以在阅读了几次之后,我尝试了四边形技术,它只是显示一个四边形并将纹理绑定到它。

我使用 STB_Image 库,并且似乎我正确地指向了我的文件(如果我在文件名上犯了错误,我的程序肯定会得到更快的响应)。

我实现了一个 print 来查看它是否捕获了正确的文件,并且确实如此!

我的代码看起来像这样,我的结果是一个出现在正确坐标中的白色方块,但没有出现纹理,文件已正确加载(打印了正确的尺寸),它只是没有绑定或出现在方...

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);

int width, height, nrChannels;
unsigned char* data = stbi_load("test.jpg", &width, &height, &nrChannels, 0);
if (data == NULL) 
    printf("Error in loading the image\n");
    exit(1);

printf("Loaded image with a width of %dpx, a height of %dpx and %d channels\n", width, height, nrChannels);
unsigned int texture;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glVertex2f(2.0, 1.0);
glTexCoord2f(2.0, 1.0);
glVertex2f(8.0, 1.0);
glTexCoord2f(8.0, 1.0);
glVertex2f(8.0, 7.0);
glTexCoord2f(8.0, 7.0);
glVertex2f(2.0, 7.0);
glTexCoord2f(2.0, 7.0);
glEnd();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (data)

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

else

    std::cout << "Failed to load texture" << std::endl;


glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

有什么想法吗?

【问题讨论】:

为什么要在绘制四边形之后设置纹理数据? 【参考方案1】:

glTexImage2D为纹理对象指定二维纹理图像。您必须这样做才能绘制四边形。 此外,glEnable(GL_TEXTURE_2D) 必须启用二维纹理。 纹理坐标必须在 [0.0, 1.0] 范围内(参见 How do opengl texture coordinates work?)。glTexCoord2f 必须设置在 glVertex2f 之前,因为当前颜色、法线和纹理坐标与顶点相关联glVertex 被调用。 由于您不生成 mipmap (glGenerateMipmap),因此必须将纹理缩小功能 (GL_TEXTURE_MIN_FILTER) 设置为 GL_LINEARGL_NEAREST。否则纹理将是 mipmap 不完整的。

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_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);
if (data)

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

else

    std::cout << "Failed to load texture" << std::endl;

glBindTexture(GL_TEXTURE_2D, 0);
glClear(GL_COLOR_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);

glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 1.0);
glVertex2f(2.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(8.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(8.0, 7.0);
glTexCoord2f(0.0, 0.0);
glVertex2f(2.0, 7.0);
glEnd();

glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

glColor3f(1.0, 1.0, 1.0);

【讨论】:

非常感谢!有用 !我将就纹理坐标进行完整的讲座,再次感谢!

以上是关于无法将纹理绑定到 GL_QUADS的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL绑定几个2D纹理

使用 VBO 的纹理绑定无法正常工作

无法从 OpenGL 中的着色器访问先前渲染的纹理

加载的 2D 纹理未将自身绑定到 QUAD

纹理可以绑定到多个 fbo 吗?

将一个纹理绑定到两个不同的统一采样器