前言:我算是个写了几年代码的小程序员。但可能真实水平不咋滴(大概可能因为像加过的班没那么多)。但是最近对图形学感起了兴趣了,这块知识点比较多比较碎,所以就想边学边记录,如果有什么问题希望大家提出来一起讨论。这里学习用的书是徐乐乐的《Unity Shader 入门精》。这书是真的对初学者很友好,深入浅出,娓娓道来。那么我们就开始吧。
什么是渲染流水线
渲染流水线就是把三维场景生成或者渲染成二维的图片。一般分为三个阶段:应用阶段、几何阶段、光栅化阶段。接下来我们就看下各个阶段的作用。
1. 应用阶段
主要工作是把渲染需要用到的几何信息也叫渲染图元,传输给下一个阶段。属于CPU阶段
- 把数据加载到显存中
- 设置渲染状态
- 调用draw call
2. 几何阶段
包含顶点着色器 曲面着色器 几何着色器 裁剪 屏幕映射
(1)顶点着色器
主要是把顶点坐标 从模型空间转到齐次裁剪空间
(2)裁剪
(3)屏幕映射
主要任务是把每个图元的x和y转换到屏幕坐标系
3. 光栅化阶段
包含 三角形设置 三角形遍历 片元着色器 逐片元操作 几个阶段 最后得到屏幕图像
片元着色器
产生一系列的数据来表述一个三角网格是怎么覆盖每个像素的
逐片元操作
这一阶段是可配置的有几个重要任务
(1)决定片元的可见性,这会涉及 模板测试和深度测试等
(2)如果这个片元经过测试就会和目标(已存在缓存中)的颜色合并
以上的过程只是比较简化版的,而且有的过程也会提前,比如为了提高性能有时会把深度测试和模块测试提前,但也是个比较复杂的问题有可能会影响到最终的渲染情况,这个之后我会再写一个博客来专门讨论这些内容,还有透明度测试等之后都会写的。
最后说明
真实的渲染流程远比上面的复杂,但是Unity也进行了一些封装。好了,先写这么多,欢迎各位大神指点一二。