求知若饥,虚心若愚
综述
渲染流水线
- 任务:由一个三维场景出发、生成(渲染)一张二维图像
- 大致可分阶段:
阶段 任务 输出 应用阶段 准备场景数据(相机、物体、光源等)、粗粒度剔除、设置渲染状态(材质、纹理、shader等) 渲染所需的几何信息(渲染图元) 几何阶段 (要绘制的图元、怎么绘制、在哪里绘制),裁剪、将顶点坐标变换到屏幕空间中 输出屏幕的二维顶点坐标,每个顶点对应的深度值、着色等相关信息 光栅化阶段 根据上个阶段数据生产屏幕像素,通过各种测试和混合决定每个渲染图元中的哪些像素应该被绘制在屏幕上(对逐顶点数据进行插值然后逐像素处理) 最终的图像 其中应用阶段是在CPU完成,后两个在GPU,剔除和裁剪的不同详见参考
CPU和GPU之间的通信
应用阶段需要做:1.把数据加载到显存 2.设置渲染状态 3.调用DrawCall
把数据加载到显存
一般会从硬盘读取数据到Ram,再从Ram拷贝到显存。Ram部分数据会留来碰撞检测之类用
GPU流水线
颜色表示了不同阶段的可配置性或可编程性:绿色表示该流水线阶段是完全可编程控制的,黄色表示该流水线阶段可以配置但不是可编程的,蓝色表示该流水线阶段是由GPU固定实现的,开发者没有任何控制权。实线表示该shader必须由开发者编程实现,虚线表示该Shader是可选的
顶点着色器
- 输入进来的每个顶点都会调用一次顶点着色器
- 主要工作有:
- 坐标变换:把顶点坐标从模型空间转换到齐次裁剪坐标,方便后续裁剪
- 逐顶点光照
裁剪
屏幕映射
将图元的xy坐标转换到屏幕坐标系,z保留以便后面深度测试
三角形设置
计算光栅化一个三角形网格所需的信息,为下一阶段提供三角形边界信息
三角形遍历
检查每个像素是否被一个三角网格所覆盖,如果是则生成一个片元。片元并不是真正意义上的像素,包含了很多状态的集合(屏幕坐标、深度、顶点信息如法线纹理坐标等)用于计算像素最终颜色
片元着色器
对上一阶段的片元序列数据进行计算,输出一个或多个颜色值。纹理采样是在这阶段
逐片元操作
通过深度测试、模版测试等测试决定每个片元的可见性,然后将片元颜色与缓冲区颜色进行混合或覆盖
逐片元操作阶段所做的操作。只有通过了所有的测试后,新生成的片元才能和颜色缓冲区中已经存在的像素颜色进行混合,最后再写入颜色缓冲区中


其他诸如深度测试、深度写入、模版测试细节、DrawCall优化(批处理)需要自行查阅