流程回顾

图-1

架构梳理

1、在进行屏幕光栅化之前,所有操作都是针对模型顶点
2、每一步的操作都是在前一步得到的顶点数据的基础上进行
3、可以把对顶点的操作过程(mvp)设计成一个单独的模块,把所有对像素的操作过程设计成一个单独的模块
4、处理每个顶点的程序我们称为VertexShader(顶点着色器),处理每个像素的过程称为PixelShader(像素着色器),这两个着色器程序可以设计为可扩展/可编程的过程,而中间(剪裁/透视除法/背面剔除/屏幕空间映射/光栅化)过程可固定

图-2·

流水线介绍

流水线: 将复杂任务分解未独立任务模块,每个执行专注一个模块,从而形成并行化生产

图-3

渲染管线

在GPU中,每个顶点都是单独通过VertexShader进行处理;每个像素也会单独通过PixelShader进行处理
每个顶点单独处理;每个像素单独处理;则可并行化计算,构成流水线,将其称之为渲染管线

图-4

设计管线功能

剪裁(Clip):输入剪裁空间坐标,考察所有三角形与可视区域的关系,并根据是否相交/包含进行剪裁(mvp之后,除以w之前)

图-5

剔除(Cull):输入透视除法后的NDC,去除背面朝向我们的三角形,留下正面朝向我们的(或者反过来)

图-6

装配与光栅化:输入屏幕空间坐标,把顶点按照图元(三角形/直线)进行组合,然后离散成栅格点的过程

图-7

注意: 每个顶点,除了位置信息,还有可能携带比如 颜色/法线/UV等属性信息;在光栅化过程中,会通过“插值”得到每个栅格点内部的各个属性值(三维情况下,做三角形插值是不准确的,需要透视矫正,后面详解)

片元着色: 输出的每个栅格点即片元,本步骤决定每个片元最终输出到屏幕的颜色

图-8

原理: 每个栅格(片元)都记录着自己携带的属性信息(颜色/法线/uv等);每个栅格都会通过片元着色器(Pixel/Fragment Shader)

混合与测试: 在三角形(或直线)的片元输出后,与画布上已有的进行对比,进行深度测试/模板测试/透明颜色混合等

图-9