OpenGL 无效的纹理或状态

OpenGL Invalid Texture or State

本文关键字:状态 纹理 无效 OpenGL      更新时间:2023-10-16

我们正在OpenGL应用程序中开发一个C++插件。应用程序将根据需要在我们的插件上调用"render"方法。在渲染纹理时,我们注意到有时某些纹理是完全绘制的,即使它们是使用有效数据创建的。它似乎是随机的纹理和时间。在调查可能导致某些纹理呈现白色的原因时,我注意到简单地尝试检索纹理的大小(即使是正确渲染的纹理(也是行不通的。以下是创建纹理并检索其大小的简单代码:

GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0,
             GL_BGRA, GL_UNSIGNED_BYTE, imageDdata);
// try to lookup the size of the texture
int textureWidth = 0, textureHeight = 0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &textureWidth);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &textureHeight);
glBindTexture(GL_TEXTURE_2D, 0);

glTexImage2D 输入的图像宽度和高度为 1536 x 1536,但从 glGetTexLevelParameter 返回的值为 16384 x 256。事实上,我传递给glTexImage2D的任何宽度和高度图像都会导致16384 x 256的输出。如果我传递 64 x 64 的宽度和高度,我仍然会得到 16384 x 256。

我在另一个独立的测试应用程序中使用相同的简单纹理加载/渲染代码,并且它始终正常工作。但是,当我在这个更大的应用程序中使用代码时,我会得到这些白色纹理。我还验证了glGetError((返回0。

我假设包含的应用程序正在设置一些 OpenGL 状态,当我们尝试渲染纹理时会导致问题。对于可能导致这些白色纹理或无效纹理尺寸的检查事项,您有什么建议吗?

更新
正确呈现的测试应用程序和未正确呈现的集成应用程序都在启用了加速 3D 图形的 Windows 7 上的 VM 中运行。下面是虚拟机环境:
CentOS 7.0
OpenGL 2.1 台面 9.2.5

您是否检查了调用此代码时是否具有有效的 OpenGL 上下文处于活动状态?您返回的值可能是变量中留下的未初始化垃圾,如果 glGetTexLevelParameter 由于某种原因失败,则不会修改这些值。请注意,如果没有激活的 OpenGL 上下文,glGetErrors 可能会返回GL_NO_ERROR

要检查是否存在OpenGL上下文,请使用wglGetCurrentContext(Windows(,glXGetCurrentContext(X11/GLX(或CGLGetCurrentContext(MacOS X CGL(来查询活动的OpenGL上下文;如果没有活动,所有这些函数都将返回NULL。


仅供参考:您应该使用 GLint 从 OpenGL 检索整数值,原因是 OpenGL 类型具有非常特定的大小,这可能与同名的原始 C 类型不同。例如,C 无符号 int 的大小可能在 16 到 64 位之间变化,而 OpenGL GLuint 始终固定为 32 位。

> https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glGetTexLevelParameter.xml

glGetTexLevelParameter 返回活动纹理单元的纹理级别参数。

尝试在所有设备上glActiveTexture。查看是否正在获取默认值。