【发布时间】:2015-09-03 14:19:42
【问题描述】:
我正在使用 OpenGL 渲染 16 位灰度图像,并且需要在没有位深度抽取的情况下将渲染数据提取到缓冲区。我的代码在 Intel(R) HD Graphics 4000 上完美运行,但在 nVidia 显卡(NVIDIA Corporation GeForce G 105M/PCIe/SSE2、NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2)当我尝试使用内部格式 GL_R16_SNORM 渲染到纹理时,它以状态 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 失败。当我使用 GL_R16 格式时它可以工作,但我也会丢失渲染纹理的所有负值。借助英特尔核芯显卡,它适用于 GL_R16_SNORM 和 GL_16 值。
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, width, height, 0, GL_RED, GL_SHORT, null);
glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
glDrawBuffers(1, new int[] {GL_COLOR_ATTACHMENT0}, 0);
int status = gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER);
nVidia 卡上出现 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 状态的原因是什么?你能建议如何调试这种情况吗? (不幸的是 glGetError()==GL_NO_ERROR)
编辑:经过进一步测试,我发现它也适用于 ATI 显卡。正如Reto Koradi 回答的那样,OpenGL 4.4 之前版本的支持是特定于制造商的,它似乎适用于 ATI 和 Intel 卡,但不适用于 nVidia 卡。
【问题讨论】:
-
在 GL 中不需要支持任何
SNORM格式作为渲染目标。
标签: opengl