[英]Writing to depth buffer from opengl compute shader
通常,在现代桌面OpenGL硬件上,什么是从计算着色器填充深度缓冲区,然后使用该深度缓冲区进行带有三角形等图形管道渲染的最佳方法?
我特别想知道有关HiZ的问题。 我也想知道在图形渲染之前或之后对深度缓冲区进行计算着色器修改是否更好?
如果在图形渲染之后运行计算着色器,则我认为深度缓冲区通常将在后台解压缩。 但是我担心围绕深度缓冲区执行的另一种方法可能是图形管线处于解压缩/非最佳状态?
据我所知,您不能将纹理与任何深度格式绑定为图像,因此无法在计算着色器中写入深度格式纹理。 请参阅glBindImageTexture文档 ,其中列出了纹理格式必须兼容的格式。 深度格式不在其中,规范说深度格式与常规格式不兼容。
纹理复制功能具有相同的兼容性限制,因此您甚至无法在计算着色器中写入普通纹理,然后再复制到深度纹理。 glCopyImageSubData没有明确的限制,但是我没有尝试过,它不再是核心配置文件的一部分。
可能的工作是写入普通纹理,然后渲染全屏三角形,并将gl_FragDepth设置为从纹理读取的值,但这是额外的全屏传递。
我不太理解您的第二个问题-如果您的计算着色器东西修改了深度缓冲区,则结果很可能会有所不同,具体取决于您在常规渲染之前还是之后进行渲染,因为不同的部分将可见或被遮挡。
但是也许这个问题没有意义,因为似乎您根本无法手动写入深度缓冲区-这可能还会回答您的第三个问题-通过不写入深度缓冲区,您就不会陷入压缩的困境:)
请注意,我不是这方面的专家,我遇到了类似的问题,亲自查看了文档/规范,所以这一切都可能是错误的:)如果您设法使用计算着色器写入深度缓冲区,请告诉我!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.