OpenGL 无效的纹理或状态
OpenGL Invalid Texture or State
我们正在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
。查看是否正在获取默认值。
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 使用 CUDA 和纹理进行图像减法
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- OpenGL 纹理状态使用警告:
- OpenGL 无效的纹理或状态