从opengl计算着色器写入深度缓冲区

时间:2016-07-24 14:14:39

标签: opengl depth-buffer compute-shader

通常在现代桌面OpenGL硬件上,从计算着色器填充深度缓冲区然后使用深度缓冲区进行三角形等图形管道渲染的最佳方法是什么?

具体来说,我想知道关于HiZ的问题。另外我想知道在图形渲染之前或之后对深度缓冲区进行计算着色器修改是否更好?

如果在图形渲染后运行计算着色器,我假设深度缓冲区通常会在后台解压缩。但我担心深度缓冲区的其他方式可能处于图形管道的解压缩/非最佳状态?

1 个答案:

答案 0 :(得分:2)

据我所知,您无法将纹理与任何深度格式绑定为图像,因此无法在计算着色器中写入深度格式纹理。请参阅glBindImageTexture documentation,它列出了纹理格式必须兼容的格式。深度格式不在其中,规范说深度格式与普通格式不兼容。

纹理复制功能具有相同的兼容性限制,因此您甚至不能写入计算着色器中的普通纹理,然后复制到深度纹理。 glCopyImageSubData没有明确限制,但我还没有尝试过它,它不再是核心配置文件的一部分。

可能有效的是写入普通纹理,然后渲染全屏三角形并将gl_FragDepth设置为从纹理读取的值,但这是一个额外的全屏传递。

我不太了解您的第二个问题 - 如果您的计算着色器内容修改了深度缓冲区,结果很可能会有所不同,具体取决于您是在常规渲染之前还是之后执行此操作,因为不同的部分将是可见的或闭塞。

但也许这个问题没有实际意义,因为看起来你根本无法手动写入深度缓冲区 - 这也可能会回答你的第三个问题 - 不写入深度缓冲区,你不能搞砸它的压缩:)

请注意,我没有这方面的专家,我遇到了类似的问题并自己查看了docs / spec,所以这一切都可能是错的:)如果你设法写入深度缓冲区,请告诉我使用计算着色器!

相关问题