2016-07-21 81 views
0

我正在看我将如何在延迟照明渲染器中实现抗锯齿。所以三次通过,几何通道,光照累积通道,然后是用于着色的第二个几何通道。Multisampling,如何读回“独特”texels

对于正常的多重采样MSAA,目标是仅对多边形边上的像素进行多重采样。并且对于每个三角形,只将片段着色器的结果写入其覆盖的子像素。但是,当然这是一个已知的问题,这对延迟照明来说有点问题。

目标是避免评估第二和第三遍中的所有子像素,因为这基本上是超级采样。如果有人知道另一种(更好/可能)实现的方式,我非常希望听到它。但是这里是我的想法:

如果你能在第一遍中制作片段着色器,只写入三角形覆盖的第一个子像素。它允许您忽略光照过程中的未写入的纹理元素。然后最后在第二个几何通道中,以某种方式读取后面只有三角形匹配的第一个子像素,这是我们原先写入的那个子像素,然后进行照明(现在写入所有覆盖的像素,因此结果可以解决)。这样,只有“独特”纹理元素才会在第2和第3遍中被评估。

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

回答

1

有那么一刻,我要去忽略目标你的问题而专注于具体要求:

  1. 你能只从片段着色器写入了“第一”的样本?

是的。你必须做的是让你的片段着色器使用装饰SampleMask(或者用GLSL的说法,使用gl_SampleMaskIn, an array of signed integers)来声明一个输入整数数组。然后,您可以逐个遍历这个数组,找到设置的第一个位。

这位是“第一个样本”。所以你然后用装饰SampleMask(用GLSL的说法,gl_SampleMask, an array of signed integers)声明一个输出整数数组。您将“第一个采样”位设置为1,将所有其他设置为零。

  1. 您知道写入的“第一个样本”是用于多采样图像中的特定像素吗?

除非您将该数据写入其他某块内存,例如SSBO或其他内容。多采样图像不知道哪些样本已被写入,因此无法知道哪一个是第一个样本。

而且,即使你可以:


你的整个思路将无法​​正常工作。

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

如果两个三角形重叠,那么您的“第一个样本”方法是没有意义的。为什么?因为有“第一样本”:从三角形1中的第一样品和从三角2.与三角形2中的第一样品可能已经覆盖从三角形的“第一样品” 1.

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

+0

好的,我看到重叠问题。但是,如果您在第一遍中写入所有涵盖的样本,则在光照传递中检测重复值并仅写入每组中的第一个。然后在第二个几何传递样本中,第一个覆盖的子像素(因为我们重用深度缓冲区而工作)。 唯一的开销是检测照明着色器中的重复项。唯一的问题是,重复可能是重复的。但即使你在光照过程中进行超取样,与超取样相比,几何通道仍然会有时间增加? – Aedoro