应用阶段 – 几何运算 – 光栅化 – 像素运算
应用阶段
CPU进行,一般包括用户输入,碰撞检测,物理模拟,动画,全局加速,调用Draw Call
渲染向优化-各种剔除算法 Cull Off,Back,Front
结束后传递下阶段数据:
几何元素:POSITION
纹理:uv-TEXCOORD0
参数
POSITION 和TEXCOORD0是unityshadr 内置代码变量
struct appdata_base {
float4 vertex : POSITION;//顶点位置
float3 normal : NORMAL;//法线
float4 texcoord : TEXCOORD0;//纹理坐标
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;//切线
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;//第二纹理坐标
float4 texcoord2 : TEXCOORD2;//第三纹理坐标
float4 texcoord3 : TEXCOORD3;//第四纹理坐标
fixed4 color : COLOR;//顶点颜色
UNITY_VERTEX_INPUT_INSTANCE_ID
};
几何阶段
1. 顶点Shading阶段
该阶段为必须含有的阶段
多用于各种顶点相关数据运算---依靠顶点位置运动产生动画,修改发现防线
顶点必须经过运算:UnityObjectToClipPos(v.vertex)
该运算把顶点坐标从 模型空间-世界空间-相机空间-裁剪空间
2. 投影阶段
细分曲面、几何Shading和流输出
一般手机不支持几何Shadering
3. 剪裁阶段
只有部分或者全部在视觉空间的图素才能传递后面阶段。完全在视觉空间的会直接传递,部分在视觉空间的会和
视觉空间边界产生新顶点,在内的保留在外得裁剪掉
4. 屏幕映射阶段
裁剪后的坐标会以三维坐标得形式传入此阶段,称为窗口坐标。窗口坐标的xy值会缩放到和屏幕始末像素一直,
被称为屏幕坐标,z轴会被映射到0到1之间。
不同api的y轴原点和方向是不同的。
光栅化
光栅化一般使用三个顶点形成的三角面作为输入,然后找到这个三角面内所有像素(图像元素),再传入下一阶段。
光栅化的作用就是将屏幕空间的二维顶点及其深度等数据转化到屏幕像素内。
像素运算阶段
通过前面所有阶段后,图素内的像素被传递到此阶段。在此阶段的计算都是逐像素的,
每个图素内的像素(而不是屏幕内的像素)都会使用一段程序来确定是否可见(如深度测试)和其颜色。