片段着色器流程图
片段着色器(fragment shader)实现了一个通用的可编程操作片段的方法.片段着色器执行由
光栅化生成的每个片段。
• Shader program(着色器程序)—片段着色器程序源码或描述将在该片段上可以执行的操作。
• Input variables(输入变量)—光栅化阶段使用插补技术为片段着色器产生顶点着色器的输出
• Uniforms—片段着色器的常量数据
• Samplers—Uniforms使用的具体类型,在纹理(Texture)中被片段着色器使用
片段着色可以丢弃片段或生成一个或多个颜色值作为输出。通常情况下,片段着色输出一个
单一的颜色值,除了渲染到多个渲染目标。在后一种情况下,每一个颜色值是每个渲染目标
的输出。光栅化所产生的颜色、深度、模板和屏幕坐标位置(XW,YW),成为对每个片段的
操作阶段的OpenGL ES 3输入。
#version 300 es precision mediump float; in vec4 v_color; out vec4 fragColor; void main() { fragColor = v_color; }
precision mediump float
设置默认精度
in vec4 v_color
输入颜色属性。
out vec4 fragColor
输出颜色属性
fragColor = v_color
片段着色器的输入是被传递到片段着色前通过图元线性插值。
每个片段执行的操作流程
•• Pixel ownership test—这个测试决定在帧缓冲区中某点(Xw,Yw)的像素当前是否被 OpenGL ES 所有,这个测试准许视窗操作系统去控制帧缓冲区中的像素是否属于OpenGL ES context,例如视窗检测到OpenGL ES 的帧缓冲区被另一个窗口遮挡,视窗系统可以决定遮 挡OpenGL ES 的内容,不显示。
•• Scissor test——测试(Xw,Yw)是否在剪切矩阵内,如果在矩阵外,片段被丢弃。 模板深度测试—决定输入的片段是否应该被丢弃
•• Stencil and depth tests—测试在模板上执行输入片段的深度值,决定输入的片段是否
应该被丢弃
•• Blending—混合新产生的片段颜色和存储在颜色缓冲区中的颜色
•• Dithering—被使用在用几种颜色的组合模拟出大范围内的多种色彩模式 per-fragment 阶段最后,片段颜色、深度值、模板值是否被写入帧缓冲区还要依靠各自的
掩 码位是否被使用,例如,颜色缓冲区能设定红色是否能被写入颜色缓冲区。
在最后,被丢弃片段的颜色、深度和模板值被写入到帧缓冲区。OpenGL ES提供了一个接口来读取帧的像素。