我正在研究 MSAA 及其工作原理。我理解这个概念是如何工作的,以及它背后的想法是什么。基本上,如果三角形的中心覆盖了像素的中心,则将对其进行处理(在非 msaa 的情况下)。但是,如果涉及 msaa。假设 4xmsaa 那么它将采样 4 个其他点作为子样本。像素着色器将按像素执行。但是,遮挡和覆盖测试将应用于每个子像素。我感到困惑的一点是,我将像素想象成屏幕上的小方块,我无法理解如何在示例矩形内确定子采样点。计算机如何知道一个像素的子样本位置。如果只有一个正方形,如何确定子采样颜色。(如果有一个正方形,那么应该只有一种颜色)。最后,如果每个子样本基本上是相同的像素,它如何可能具有不同的深度值。谢谢!
1 回答
基本上,如果三角形的中心覆盖了像素的中心,则将对其进行处理(在非 msaa 的情况下)。
不,这没有意义。三角形的中心只是一个点,掉到像素中心的那一品脱没有任何意义。标准光栅化规则是:如果像素的中心位于三角形内部,则生成一个片段(对于像素中心正好位于三角形边界上的情况有特殊规则)。
我感到困惑的一点是,我将像素想象成屏幕上的小方块,我无法理解如何在示例矩形内确定子采样点。
不知道“样本矩形”是什么意思,但把它放在一边:如果您使用某个像素为 1x1 单位面积的坐标参考系,那么您可以简单地使用小数部分来描述像素内的位置。
默认的 OpenGL 窗口空间使用一个约定,其中 (0,0) 是左下角像素的(width,height)
左下角,是右上角像素的右上角,所有像素中心都是半整数.5
。
真实 GPU 的光栅化器确实适用于定点表示,并且 D3D 规范要求它具有至少 8 位的子像素位置小数精度(GL 将精确精度留给实现者)。
请注意,此时像素栅格根本不相关。覆盖样本只是测试某个 2D 点是否位于 2D 三角形内部或外部,并且点始终是数学上无限小的实体,面积为 0。可以任意定义坐标系进行此计算的约定.
如果只有一个正方形,如何确定子采样颜色。(如果有一个正方形,那么应该只有一种颜色)。最后,如果每个子样本基本上是相同的像素,它如何可能具有不同的深度值。
当您使用多重采样时,您始终使用多重采样帧缓冲区,这意味着对于每个像素,没有单一的颜色、深度、...值,但有n
(您的多重采样计数,通常在 2 到 16 之间)。您将需要一个额外的通道来计算显示抗锯齿结果所需的单个每像素值(在默认帧缓冲区上完成时,grpahics API 可能会对您隐藏它,但是当您使用自定义渲染目标时,您必须手动执行此操作)。