C++ OpenGL:Can';无法获得要显示的纹理

C++ OpenGL:Can';无法获得要显示的纹理,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,我正在尝试添加一个纹理到一个简单的正方形超过5小时,但我仍然没有做到这一点 以下是我在paintGL()中使用的代码: glEnable(GL_TEXTURE_2D); GLuint id; glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); float pixels[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f

我正在尝试添加一个纹理到一个简单的正方形超过5小时,但我仍然没有做到这一点

以下是我在paintGL()中使用的代码:

glEnable(GL_TEXTURE_2D);

GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);

float pixels[] = {
    0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f
};

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(1,1,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,1,0);
glEnd();

if (glGetError() != 0)
{
    qDebug() << glGetError();
}

在正确的位置:就在
glTexImage2D
之后!上面的代码经过编辑,现在工作起来很有魅力。

在我看来,你只使用了四分之一的纹理。它只有4个像素,您已经将纹理坐标设置为第一个像素。如果该像素为白色,并且纹理环境设置为将四边形的颜色乘以纹理,并且设置为使用最近邻采样,则只会得到颜色。尝试将纹理坐标更改为(0,0)到(1,1),而不是(0,0)到(0.5,0.5),然后查看这是否会提供预期的结果。您还可以尝试以不同的方式设置各种纹理参数和环境,以查看其对图形的影响。

您必须为纹理指定过滤:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

因为默认筛选器使用mipmap,但您不生成它们。

glBegin
之前,请尝试添加:
glColor4f(1.0f、1.0f、1.0f、1.0f)表示色调为白色(纹理将以原始颜色和不透明度绘制)。正方形为白色,仅为白色。能否在
glTexImage2D(…)
之后向代码添加以下两行内容(以使纹理mipmap完整)<代码>glTexParameteri(GL_纹理_2D,GL_纹理_基础_级别,0);glTexParameteri(GL_纹理_2D,GL_纹理_最大水平,0)。在您这样做之后,如果您按照user1118321的答案进行操作,我怀疑问题会得到解决。谢谢@AndonM.Coleman,这就是解决方案!为什么要在绘图功能中创建纹理对象?这太疯狂了,因为每次重新绘制窗口时,都会创建一个新的纹理,而旧的纹理仍然存在,从未被删除,并且会泄漏内存。创建一次纹理,它不起作用。谢谢你的帮助。(我仍在尝试一些参数)+1:理论上这听起来不错,但我认为答案不完整。我怀疑OP具有所有默认纹理过滤器状态。更紧迫的问题是纹理没有mipmap完成,默认的缩小过滤器是
GL\u NEAREST\u mipmap\u LINEAR
。一旦纹理完成mipmap,你问题中讨论的其他内容就非常相关了。啊,是的,有一段时间没碰到那个,所以忘了那个案例。谢谢不必为纹理指定过滤。所有纹理都具有初始缩小和放大过滤器。原始问题中的问题实际上是纹理的mipmap不完整,默认的缩小过滤器是
GL\u NEAREST\u mipmap\u LINEAR
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);