片段处理器负责运行片段着色器。顶点着色器负责的操作包括:
- 为每个像素计算颜色和纹理坐标
- 纹理应用(应用纹理)
- 雾计算
- 计算法线(如果你想对每个像素应用光照)
本单元的输入为之前阶段计算得到的插值如顶点位置,颜色和法线等。
顶点着色器会为每个顶点计算这些值。现在我们在处理图元中的片段,因此需要插值。
和顶点处理器一样,当你编写了一个片段着色器,它将替代对应的所有固定功能。因此让片段着色器执行纹理操作,然后将雾操作留给固定功能管线是不可能的。程序员必须编写应用需要的所有效果。
片段处理器对单个片段进行处理,因此对于旁边的片段一无所知。与顶点着色器类似,片段着色器能够访问OpenGL状态,因此它能够访问在OpenGL应用程序中指定的的雾颜色。
注意:片段着色器不能够修改之前计算得到的像素坐标。回忆一下,在顶点处理器中,我们使用模型视图和投影矩阵来变换顶点。视口变换应用于此之后,但是片段处理器之前。片段着色器能够访问屏幕像素的位置但是不能改变它。
片段着色器有两个输出选项:
- 丢弃片段,因此什么也不输出
- 当需要渲染到多个目标上时,计算gl_FragColor(片段的最终颜色)或者gl_FragData。
注意:片段着色器不能访问帧缓冲区。这意味着像混合这样的操作只能应用于片段着色器之后。
整个shader流程: