OpenGL无效的纹理或状态

时间:2014-12-22 19:20:26

标签: c++ opengl textures

我们正在开发OpenGL应用程序中的C ++插件。该应用程序将调用"渲染"必要时在我们的插件上的方法。在渲染纹理时,我们注意到有时一些纹理被绘制为完全白色,即使它们是使用有效数据创建的。关于哪种纹理和何时,似乎是随机的。在研究可能导致某些纹理呈现白色的原因时,我注意到只是尝试检索纹理的大小(即使是正确渲染的纹理)也不起作用。以下是创建纹理并检索其大小的简单代码:

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状态,当我们尝试渲染纹理时会导致问题。您是否有任何建议可以检查可能导致这些白色纹理或纹理尺寸无效的事情?

更新
正确呈现的测试应用程序和无法正确呈现的集成应用程序都在Windows 7上启用了加速3D图形的VM中运行。这是VM环境:
CentOS 7.0
OpenGL 2.1 Mesa 9.2.5

2 个答案:

答案 0 :(得分:0)

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

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


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

答案 1 :(得分:0)

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

  

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

在所有单位上尝试glActiveTexture。看看你是否获得了默认值。