OpenGL 即时模式纹理不工作
OpenGL Immediate Mode textures not working
我正在尝试使用即时模式纹理构建一个简单的项目。
不幸的是,当我渲染时,显示的是 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
您向 glTexImage2D()
传递了一个无效参数。 GL_RGB8
不是第 7 个 (format) 参数支持的值之一。正确的值为 GL_RGB
.
大小格式,如 GL_RGB8
,用于 internalFormat 参数。在那种情况下,该值定义了组件的数量和用于纹理内部存储的每个组件的大小。
format 和 type 参数定义了您传入的数据。对于这些,format只定义了组件的数量,而type定义了每个组件的类型和大小。
每当您的 OpenGL 代码出现问题时,请务必调用 glGetError()
检查错误。在这种情况下,您会看到由 glTexImage2D()
调用引起的 GL_INVALID_ENUM
错误。
我正在尝试使用即时模式纹理构建一个简单的项目。 不幸的是,当我渲染时,显示的是 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
您向 glTexImage2D()
传递了一个无效参数。 GL_RGB8
不是第 7 个 (format) 参数支持的值之一。正确的值为 GL_RGB
.
大小格式,如 GL_RGB8
,用于 internalFormat 参数。在那种情况下,该值定义了组件的数量和用于纹理内部存储的每个组件的大小。
format 和 type 参数定义了您传入的数据。对于这些,format只定义了组件的数量,而type定义了每个组件的类型和大小。
每当您的 OpenGL 代码出现问题时,请务必调用 glGetError()
检查错误。在这种情况下,您会看到由 glTexImage2D()
调用引起的 GL_INVALID_ENUM
错误。