《Unity Shader入门精要》的有关渲染流水线的知识总结
名词解释
顶点:包含一个几何顶点的位置,法线方向,颜色等信息的数据
图元:顶点的集合(点,线,多边形)
网格:图元的集合
片元:一个像素的状态(屏幕坐标,深度,法线,纹理坐标等用于计算该像素最终颜色的信息)集合
光栅化:把顶点数据转换为片元的过程。将图转化为一个个栅格(像素)组成的图。本质是坐标变换、几何离散化。(转自:https://blog.csdn.net/fishmai/article/details/63257662)
一、应用阶段
CPU加载数据到显存,设置渲染状态,调用Draw Call
1、CPU把内存中场景的数据(纹理、网格、顶点位置信息、法线方向、颜色等渲染所需数据)加载进显存。
2、CPU设置渲染状态(纹理、材质、使用的顶点/片元着色器、光源属性等定义网格怎么被渲染的状态)
3、CPU调用Draw Call(指向需要被渲染的图元列表的渲染命令)命令GPU根据1中的顶点数据和2中的渲染状态计算,输出屏幕像素。(即GPU流水线)
二、几何阶段
GPU对顶点进行坐标变换、光照计算颜色值等处理,对图元进行裁剪、映射坐标到屏幕坐标系等处理
1、顶点着色器【可编程】
顶点坐标变换(必做:将顶点坐标从模型坐标系转到屏幕坐标系)、逐顶点光照
(顶点动画)
2、曲面细分着色器【可选】
细分图元
3、几何着色器【可选】
逐图元着色,产生更多图元
4、裁剪【固定,可配置】
裁剪不可见图元或其部分
5、屏幕映射【固定】
把每个图元的x,y转换到屏幕坐标系(加上z座标称为窗口坐标系)下,z坐标不变。
屏幕坐标:该顶点对于哪个屏幕像素,及距离多远。
注意:OpenGL的屏幕坐标系原点在左下方,DirectX则在左上方。
三、光栅化阶段
通过计算和遍历,从被三角网格覆盖的像素生成片元,对其进行着色等操作,最后通过模式,深度等测试的可见片元被计算出颜色值来和颜色缓冲区的像素值进行混合输出最后的屏幕像素颜色结果
1、三角形设置【固定】
计算光栅化一个三角网格所需信息(边界像素的坐标信息)
2、三角形遍历(扫描变换)【固定】
遍历像素判断被三角网格覆盖的像素并生成片元(通过三角网格三个顶点的信息对覆盖区域的像素进行插值)
3、片元着色器【可编程】
计算片元颜色值
4、逐片元操作【可配置】
(1)决定片元的可见性。通过模板、深度等测试
模板测试:读取模板缓冲区该片元位置的模板值与参考值比较来决定是否丢弃
(限制渲染区域、渲染阴影、轮廓渲染)
深度测试:读取深度缓冲区的深度值与片元的深度值比较来决定是否丢弃
深度写入:比较完后是否覆盖缓冲区内值
(透明效果)
注意:Unity将深度测试放到片元着色器之前(Early-Z技术),省去对通不过深度测试的片元着色
(2)将通过测试的片元的颜色与在颜色缓冲区内的颜色进行混合
对于渲染流水线,Unity Shader封装了很多功能。我们可以在Unity Shader中设置输入,编写顶点、片元着色器,设置状态。