上下文:
我使用的是延迟渲染设置,在第一阶段,我有两个FBO:一个是GBuffer,用于存储所有可见片段的法线、反照率和材料信息。此FBO有32位深度纹理.在计算任何照明之前,这会在几何通道中被画入其中。
第二个FBO是纯颜色的,从黑色开始,但是在几个通道上积累了照明,从GBuffer的采光着色器开始,然后使用加性混合写到只有颜色的缓冲器中。
问题是,我真的很想利用早期的深度测试来让我的照明只计算包含实际几何(不仅仅是天空)的碎片。我能想到的最好的方法就是用深度测试来测试任何在阳光下深度为1的像素,或者让位于测点光影响范围后面的像素失效。但是,我认为我不能把这个深度纹理绑定到我的彩色FBO,因为我也从它里面的照明着色器内取样,以计算碎片在世界空间中的位置。
因此,我的问题是:是否有一种方法可以使用相同的深度纹理进行早期深度测试,以及在阴影内部取样?或者,如果没有,是否还有其他(合理的)方法来拒绝不包含几何的像素?我不会在我的灯光通道中写到这个深度的纹理。
我只需要针对PC上的现代图形硬件(这样我就可以使用任何常见的扩展,或者openGL 4.6功能)。
发布于 2020-08-23 02:18:23
在OpenGL中有一些关于读取着色器中的数据的规则,这些数据也由于一个框架缓冲区操作而被更新。那些规则过去是相当严格的。实际上,预GL4.4,您要做的规则是实际上是未定义的行为。也就是说,如果将来自纹理的图像附加到呈现FBO,并且您从该纹理中获取一个样本,使从附加的图像中读取是完全可能的,您就得到了未定义的行为。没关系,如果您的写掩码意味着没有发生任何书写;它是UB。
幸运的是,它现在已经有了明确的定义。只有在实际编写的时候才能得到UB,而不仅仅是因为您有一个附加到FBO的图像。所谓“现在”,我指的基本上是过去10年制造的任何硬件。虽然障碍和GL4.5是最近才出现的,但它们的前身NV_texture_barrier实际上已经很老了。尽管是NVIDIA的名字扩展,但如此广泛地实施才是甚至可以在MacOS实现上使用。
https://stackoverflow.com/questions/63542591
复制相似问题