【问题标题】:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT when using texture with internal format GL_R16_SNORMGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 使用内部格式为 GL_R16_SNORM 的纹理时
【发布时间】:2015-09-03 14:19:42
【问题描述】:

我正在使用 OpenGL 渲染 16 位灰度图像,并且需要在没有位深度抽取的情况下将渲染数据提取到缓冲区。我的代码在 Intel(R) HD Graphics 4000 上完美运行,但在 nVidia 显卡(NVIDIA Corporation GeForce G 105M/PCIe/SSE2NVIDIA 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


【解决方案1】:

GL_R16_SNORM 仅在 OpenGL 4.4 中成为必需的可呈现颜色的格式。

例如,如果您查看 4.3 规范(从第 179 页开始)中的大纹理格式表,则会检查“color-renderable”字段的 R16_SNORM。但随后在第 178 页的“所需纹理格式”下,R16_SNORM 被列为“纯纹理颜色格式”。这意味着虽然实现可以支持以这种格式呈现,但这不是必需的。

在 4.4 规范中,表格(从第 188 页开始)基本上是相同的。 R16_SNORM 在“CR”列中有一个复选标记,表示“可渲染颜色”。但是规则变了。在 4.4 及更高版本中,实现必须支持所有颜色渲染格式。现在,第 186 页上的“所需纹理格式”部分不再包含列表,而是简单地引用了该表。规范的更改日志部分也提到了这一点。

这意味着除非您至少需要 OpenGL 4.4,否则对该格式的渲染支持确实取决于供应商/硬件。

【讨论】:

  • 感谢您的完美回答!对于所有 4.4 之前的版本,我将在着色器中处理负值,对于 4.4 及更高版本,请使用我当前的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多