Macos OpenGL即时模式纹理不工作

Macos OpenGL即时模式纹理不工作,macos,opengl,immediate-mode,Macos,Opengl,Immediate Mode,我正在尝试使用即时模式纹理构建一个简单的项目。 不幸的是,当我渲染时,会显示GL颜色而不是纹理。我到处寻找解决方案,但在在线示例和我的代码之间没有发现有意义的区别 我已经把它简化为一个最小的失败例子,我在这里提供了这个例子。如果我的理解是正确的,这应该会产生一个有纹理的四边形,有黑色、红色、绿色和蓝色的角。不幸的是,它看起来是紫色的,好像完全忽略了纹理。我做错了什么 #include <glut.h> GLuint tex; void displayFunc() { gl

我正在尝试使用即时模式纹理构建一个简单的项目。 不幸的是,当我渲染时,会显示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();
}
#包括
胶合特克斯;
void displayFunc(){
glEnable(GL_纹理_2D);
glBindTexture(GL_TEXTURE_2D,tex);
glBegin(GLU三角带);
GL3F(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);
格伦德();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(0,0);
GLUTINITWindowsSize(640480);
测试窗口(“测试”);
glutDisplayFunc(显示函数);
GLubyte textureData[]={0,0,0,255,0,0,0,255,0,0,0,255,255,0};
GLsizei宽度=2;
GLsizei高度=2;
glGenTextures(1和tex);
glBindTexture(GL_TEXTURE_2D,tex);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB8,宽度,高度,0,GL_RGB8,GL_无符号字节,(GLvoid*)纹理数据);
glutMainLoop();
}
输出:

也可能值得一提的是:

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


图形卡:NVIDIA GeForce GT 650M 1024 MB

您正在将无效参数传递给
glTexImage2D()
GL_RGB8
不是第7个(格式)参数支持的值之一。正确的值为
GL\u RGB

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

格式和类型参数定义传入的数据。对于这些组件,格式仅定义组件的数量,而类型定义每个组件的类型和大小


每当OpenGL代码出现问题时,请确保调用
glGetError()
检查错误。在这种情况下,您会看到由于调用
glTexImage2D()
而导致的
GL\u INVALID\u ENUM
错误。

除Reti Koradi的回答外,您的纹理也不完整。您应该通过
glTexParameteri
@derhass明确地将纹理缩小过滤器设置为
GL\u LINEAR
GL\u NEAREST
,谢谢!我需要这两个和雷蒂·科拉迪的答案来修复它。谢谢!这一点,加上德哈斯的评论,解决了这个问题。