OpenGL渲染白色纹理错误

Posted

技术标签:

【中文标题】OpenGL渲染白色纹理错误【英文标题】:OpenGL rendering white texture bug 【发布时间】:2020-12-09 17:58:42 【问题描述】:

我使用 OpenGL 和 SDL2 来渲染脊椎动画。在特定的 z 顺序中,这些动画像白色块一样排列。所有纹理都变白。我猜这个错误是在 OpenGL 绘制代码中。

glPushMatrix();

float texw=0, texh=0;
if (texture) 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    if (SDL_GL_BindTexture(texture, &texw, &texh) != 0)
        printf("WTF\n");


glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(color[0], color[1], color[2], color[3]);

glVertexPointer(2, GL_FLOAT, 0, vertices);


glTexCoordPointer(2, GL_FLOAT, 0, uvs);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// if (num_vertices > 0) 
glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, indices);

glDisableClientState(GL_VERTEX_ARRAY);
// glDisableClientState(GL_COLOR_ARRAY);


if (texture) 
    SDL_GL_UnbindTexture(texture);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);


glColor4f(1.0, 1.0, 1.0, 1.0);
glPopMatrix();

这是我的代码,有人看到这段代码有问题吗? 为什么我得到白色纹理?

【问题讨论】:

那些SDL_GL_BindTexture()/SDL_GL_UnbindTexture() 调用(使用SDL_Textures,而不是GLuints)在那里做什么?假设textureGLuint 就像glGenTextures() 要求一样,那怎么会编译?在minimal reproducible example 中编辑。 【参考方案1】:

二维纹理必须由glEnable(GL_TEXTURE_2D) 启用,并且可以由glDisable(GL_TEXTURE_2D) 禁用。 如果启用了纹理,则在绘制几何图形时当前绑定的纹理将包裹在几何图形上。

如果启用纹理,则默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为GL_MODULATE。见glTexEnv。 这会导致纹理纹素的颜色与您设置的最后一个颜色“混合”glColor4f

glEnable(GL_TEXTURE_2D);
glDrawElements(GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, indices);
glDisable(GL_TEXTURE_2D);

请注意,如果您不使用着色器程序,所有这些仅适用于即时模式。

【讨论】:

谢谢Rabbid76,我尝试使用您的提示,但没有任何改变。白块还在屏幕上:( @JonasForte 所以在你的代码的其他地方还有另一个错误。 你认为错误不在这段代码中吗? @JonasForte 如果启用纹理,四边形不能是白色的,除非纹理本身是白色的。

以上是关于OpenGL渲染白色纹理错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 渲染到 Framebuffer 会产生一个白色的矩形纹理

OpenGL 无效的纹理或状态

OpenGL渲染纹理全白

OpenGL纹理渲染与原始不匹配

OpenGL:禁用纹理颜色?

Opengl渲染到深度纹理 - 红色?