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

时间:2016-12-06 17:23:08

标签: opengl graphics fragment-shader rasterizing

根据我的理解,片段着色器从光栅化中获取结果。但是,根据计算机图形学:原理与实践(第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]是根据场景中的照明计算的。因此,在此之后,片段着色器将为每个片段应用颜色,纹理等。片段着色器或纹理中的颜色如何与从光栅化计算的颜色混合?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

如果未提供片段着色器,片段中像素的颜色将保持不变

答案 1 :(得分:1)

您的理解是正确的,光栅化后会出现阴影。

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

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