为什么片段不一定对应像素一对一?

时间:2014-08-23 15:32:18

标签: opengl

这是一个很好的解释什么是片段:

https://gamedev.stackexchange.com/questions/8977/what-is-a-fragment/8981#8981

但是here(而不仅仅是这里)我已经读过“我想强调一个像素不一定是一个片段,多个片段可以组合成一个像素......”。但是我不清楚什么是片段以及为什么它们不一定与像素一一对应?

编辑:当多个片段形成一个像素时,它只是在它们在投影后重叠的情况下,或者是因为像素比片段大,因此你需要将相同的多个片段放在一起颜色形成一个像素?

2 个答案:

答案 0 :(得分:5)

片段的位置可以通过其内置gl_FragCoord变量进行查询,其中xy组件直接对应于屏幕上的像素。所以你可以说片段确实对应于一个像素。

然而,片段输出颜色并将该颜色存储在其坐标处的颜色缓冲区中。这并不意味着此颜色是向观看者显示的实际像素颜色。

因为为每个对象运行了片段着色器,所以可能会在第一个对象之后绘制其他对象,该对象也会在同一屏幕坐标处输出片段。在进行深度测试,模板测试和混合时,颜色缓冲区中的结果颜色值可能会被新颜色覆盖和/或合并。

这样想:

Object 1 gets drawn and draws the color purple at screen coordinate (200, 300);
Object 2 gets drawn and draws the color red at same coordinate, overwriting it.
Object 3 (is blue) has transparency of 50% at same coordinate, and merges colors.
Final fragment color output is then combination of red and blue (50%).

最终得到的像素可以是来自单个片段着色器运行的颜色,被许多其他片段着色器运行覆盖的颜色,或通过混合的颜色组合。

答案 1 :(得分:0)

当多样本消除锯齿(MSAA)或任何其他模式改变渲染像素与屏幕像素的比率时,片段不等于像素。

在4x MSAA的情况下,每个屏幕像素将由显示缓冲区中的4(2x2)个片段表示。无论多边形覆盖了多少个碎片,特定多边形的片段着色器将仅对屏幕像素运行一次。由于多边形可能无法覆盖像素内的所有片段,因此它只会将颜色存储到它所覆盖的片段中。对于可能覆盖一个或多个片段的每个多边形重复这一过程。然后在最终显示中,混合所有4个片段以产生最终的屏幕像素。