多重采样,如何回读"unique"纹素



我正在研究如何在延迟照明渲染器中实现抗锯齿。因此,三个过程,一个几何过程,一次照明累积过程,然后是第二个几何过程进行着色。

使用普通多重采样MSAA,目标是仅对多边形边上的像素进行多重采样。对于每个三角形,只将片段着色器的结果写入它所覆盖的子像素。当然,这是一个已知的问题,延迟照明有点问题。

目标是避免在第2次和第3次传递中评估所有子像素,因为这基本上是超级采样。如果有人知道另一种(更好/可能)实现这一目标的方法,我很想听听。但我的想法是:

如果可以在第一次过程中使片段着色器仅写入三角形覆盖的第一个子像素。它允许您忽略照明过程中未写入的纹素。最后,在第二个几何过程中,以某种方式只读取三角形匹配的第一个子像素,即我们最初写入并为其进行照明的子像素(现在正常写入所有覆盖的纹素,以便解决结果)。这样,只有"唯一"纹素才会在第二次和第三次通过中进行评估。

有人能说出如何在glsl中做到这一点吗(或者确认这是不可能的)?我真的看不出为什么理论上这是不可能的,但也看不出有任何方法可以在glsl中做到这一点。

暂时,我将忽略您问题的目标,而专注于特定请求:

  1. 你能只从片段着色器写入"第一个"样本吗

是的。您要做的是让片段着色器使用装饰SampleMask(或者,用GLSL的说法,使用gl_SampleMaskIn,一个有符号整数数组)来声明一个输入整数数组。然后,您将一点一点地迭代这个数组,以找到设置的第一个位。

此位是"第一个样本"。然后使用装饰SampleMask(用GLSL的说法,gl_SampleMask,一个有符号整数的数组)声明一个输出整数数组。您将"第一个采样"位设置为1,将所有其他位设置为零。

  1. 你能知道多样本图像中特定像素的"第一个样本"是什么吗

除非你将数据写入其他内存,比如SSBO之类的。多样本图像不知道写入了哪些样本,因此无法知道哪个是第一个。

即使你可以:


你的整个想法是行不通的

多采样只是基于单一简化假设的超采样。也就是说,可以给三角形生成的所有样本相同的每个片段值(深度除外)。在所有其他方面,它只是超级采样:每像素添加更多样本。

如果两个三角形重叠,那么你的"第一个样本"方法就没有意义了。为什么?因为有两个"第一个样本":来自三角形1的第一个样本和来自三角形2的第一个采样。三角形2可能已经覆盖了三角形1中的"第一个样本"。

即使没有覆盖第一个样本,您仍然不知道每个三角形贡献了多少样本。如果一个三角形贡献了像素右侧50%的样本,而一个重叠的三角形贡献了底部50%的像素样本,那么你应该只得到第一个三角形贡献的25%。你怎么知道用你的方法做到这一点?

相关内容

  • 没有找到相关文章

最新更新