片段着色器会覆盖从光栅化生成的片段颜色?

问题描述:

根据我的理解,片段着色器从光栅化中获取结果。然而,根据计算机图形学:原理与实践(第3版),光栅化将计算基于照明在各个方向上的片段的颜色:片段着色器会覆盖从光栅化生成的片段颜色?

for each pixel position (x, y): 
closest[x, y] = ∞ 
for each triangle T: 
    for each pixel position (x, y): 
    let R be the ray through (x, y) from the eye 
    let P be the intersection of R and T 
    if P exists: 
     sum = 0 
     for each direction: 
      sum += . . . 
      if the distance to P is less than closest[x, y]: 
      pixel[x, y] = sum 
      closest[x, y] = |P − O| 

所以片段彩色像素[X,Y]的计算基在现场照明。因此,在此之后,片段着色器会将颜色,纹理等应用到每个片段。片段着色器或纹理中的颜色与从光栅化计算出的颜色混合的方式如何?

片段着色器是您的栅格化过程的实现,所描述的栅格化是由着色器在固定管道中完成的,灵活的管道使用您提供的着色器程序。

来自opengl文档: 片段着色器是着色器阶段,它将把由聚合生成的片段处理为一组颜色和单个深度值。

片段着色器是基元被光栅化后的OpenGL管线阶段。对于由基元覆盖的像素的每个样本,生成“片段”。每个片段都有一个窗口空间位置和一些其他值,它包含所有来自最后一个顶点处理阶段的插值的每顶点输出值。

片段着色器的输出是一个深度值,一个可能的模板值(片段着色器未修改)以及零个或多个可能写入当前帧缓冲区中的缓冲区的颜色值。

如果片段着色器没有提供在片段像素的色彩会留未修改

+0

”片段着色器的输出是深度值“。根据我的理解,深度值是在光栅化期间计算的。 – lightrek

+0

片段着色器是你的光栅化过程的实现吗?我认为片段着色器是在栅格化之后进行的。 – lightrek

+0

@lightrek:这不完全准确。可以在光栅化过程中计算深度,但片段着色器有最终的说法。如果片段着色器从不写入深度,则可以使用栅格化值,并且硬件设计用于执行早期深度测试,并在此场景中跳过对任何失败片段的着色。但是,如果片段着色器将任何内容写入'gl_FragDepth',则深度测试必须在着色后执行。出于同样的原因,模板测试也可以提前完成;有一整套“早期片段测试”。 –

你的理解是正确的,阴影光栅化后会发生。

这是光栅化和输出合并(混合)之间的可编程步骤。栅格化插值(非平坦)每个顶点属性,并使用它计算的值为每个片段生成一个或多个样本。

在栅格化过程中计算的值被传递到片段着色器阶段,该阶段决定如何处理它们(例如,在特定坐标处对纹理进行采样)以产生颜色和深度。在着色之后,根据设置混合等式将通过深度/模板测试的片段与已存在于帧缓冲区中的任何片段合并(混合)以产生像素。 “