【发布时间】:2014-12-22 19:20:25
【问题描述】:
我们正在 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 状态,这会在我们尝试渲染纹理时导致问题。对于可能导致这些白色纹理或纹理尺寸无效的检查事项,您有什么建议吗?
更新
我正确渲染的测试应用程序和未正确渲染的集成应用程序都在启用了加速 3D 图形的 Windows 7 上的 VM 中运行。这是虚拟机环境:
CentOS 7.0
OpenGL 2.1 台面 9.2.5
【问题讨论】:
-
您使用的是哪个平台,遇到错误时GL的上下文版本是什么?
-
谁他妈的投票结束了这个完美的问题?
-
@MuertoExcobito CentOS 7.0 和 OpenGL 2.1 通过 Mesa 9.2.5
-
这些调用是直接按这个顺序执行的吗?意思是,
glGetTexLevelParameteriv()在glTexImage2D()之后立即 被调用?还是为了简洁而省略了这些调用之间的任何内容? -
为此构建一个小测试并检查您的应用程序中是否存在错误。这应该不难。如果测试失败,请在具有最新驱动程序的本机显卡上运行它。如果这仍然失败,您的测试可能是错误的。如果原生卡工作正常,那么 Mesa 中可能存在错误。老实说,我不知道 Mesa 在 VM 主机中模拟 3d 加速方面的工作原理,但我认为这不是主要用例,所以我想说你现在是该领域的首席开发人员。