c++ - 无法将纹理绑定(bind)到 GL_QUADS

标签 c++ opengl textures glut opengl-compat

我尝试在 OpenGL 中制作动画,我的顶点和动画都在工作,但我想给它放一个背景图像,带有诸如 bmp 之类的文件或其他文件。

因此,经过几次阅读后,我尝试了四边形技术,它只是显示一个四边形并将纹理绑定(bind)到它。

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

我实现了一个打印来查看它是否捕获了正确的文件并且它确实捕获了!

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

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);

有任何想法吗?

最佳答案

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);

关于c++ - 无法将纹理绑定(bind)到 GL_QUADS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59896209/

相关文章:

C++20 bit_cast 与 reinterpret_cast

opengl - 用 GLFW3 编译 OpenGL 程序

c++ - 使用 QOpenGLWidget 中的着色器更新 QImage

three.js - 如果数据纹理不是正方形,则会出现奇怪的行为(1 :1)

c++ - exit() 是否刷新并关闭 `ofstream` 对象?

c++ - 如何从 64 位整数中获取高 20 位?

opengl - 顶点着色器和片段着色器中的 gl_Color 和 gl_FrontColor 之间的关系是什么

c# - 在 Unity 中使 Material 透明

ios - 周围没有任何东西的纹理

c++ - Eigen 透视投影矩阵