我正在使用OpenGL渲染16位灰度图像,并且需要获取渲染的数据以在不进行位深度抽取的情况下进行缓冲。我的代码在Intel®HD Graphics 4000上运行良好,但是在nVidia图形卡(NVIDIA Corporation GeForce G 105M / PCIe / SSE2,NVIDIA Corporation GeForce GT 640M LE / PCIe / SSE2)上,当我尝试渲染时,状态为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT失败使用内部格式GL_R16_SNORM进行纹理处理。当我使用GL_R16格式时,它可以工作,但是我也会释放渲染纹理的所有负值。使用Intel HD Graphics,它可以同时使用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_R16_SNORM
仅在OpenGL 4.4中成为必需的颜色可渲染格式。
如果查看4.3规范中的大型纹理格式表(从第179页开始),则会检查“颜色可渲染”字段R16_SNORM
。但是,然后在第178页上的“所需的纹理格式”下,R16_SNORM
被列为“仅纹理的颜色格式”。这意味着虽然实现可以支持以这种格式进行呈现,但不是必需的。
在4.4规范中,表格(从第188页开始)基本上是相同的。R16_SNORM
在“ CR”列中有一个复选标记,表示“可显色”。但是规则被改变了。在4.4及更高版本中,所有颜色可渲染格式都必须由实现支持。现在,不再包含列表,而是在第186页上的“所需纹理格式”部分仅引用了该表。在规范的更改日志部分中也提到了这一点。
这意味着除非您至少需要OpenGL 4.4,否则对渲染为这种格式的支持确实取决于供应商/硬件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句