|
第2章 渲染流水线
- 渲染流水线的过程
- 应用,几何,光栅化各自干的事情,和每阶段的输入输出
- 前者具体到CPU和GPU上是干什么的
- 顶点着色器,片元着色器
- 模板测试,深度测试,混合
第3章 Unity Shader 基础
- Shader和材质的关系
- Shader结构->Shader,Properties,SubShader,Tags,RenderStep,Pass,FallBack
- Vertex shader和Fragment shader
- CG/HLSL加ShaderLab怎么写Shader
- 表面着色器,顶点/片元着色器,固定函数着色器
- 随意写的简单Unity Shader代码模板,如下
Shdaer "shader类别/shader名字" {
Properties {
_name1 ("dispaly name", PropertyType) = DfaultValue
_name2 ("dispaly name", PropertyType) = DfaultValue
//假设有纹理
_MainTex ("Texture", 2D) = "white" {}
}
//显示器会选择可以运行的SubShader
SubShader {
[Tags]
[RenderStep] //常见LOD 200
Pass {
CGPROGRAM
//表示顶点着色器程序为vert,片元着色器程序为frag
//包含的"UnityCG.cginc"文件提供appdata结构以及一些常用函数
#pragma vertex vert
#pragma fragment frag
#inlcude "UnityCG.cginc"
//要在程序里调用Properties,要映射到同名变量
PropertyType _name1;
PropertyType _name2;
//假设有纹理,采样需要加下面这句
float4 _MainTex_ST
//这是一个在顶点着色器和片元着色器间传递数据的结构
struct v2f{
float4 pos:SV_POSITION; //表示这是MVP矩阵后输出的顶点坐标
float2 uv:TEXCOORD0; //表示这是顶点的纹理坐标
fixed3 color:COLOR0; //表示这是顶点的颜色,0表示第0组
}
v2f vert(appdata_full v) //或appdata_base等
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); //模型转世界转观察转裁剪/视口(坐标系)
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); //加上材质球的tiling和offset
o.color = (1, 0.5, 0.5); //随意定一个颜色
return o; //顶点着色器核心任务,输出经过MVP矩阵后的顶点
}
fixed4 frag(v2f i):SV_Target //输出要渲染的目标颜色
{
fixed4 texcol = tex2D(_MainTex, i.uv); //用纹理坐标从纹理上取纹素
//中间有一些改变颜色的操作,如texcol.rgb = fixed3(0.5, 0.5, 1);
//或者不取纹理的颜色,return fixed4(i.color, 1)
return texcol; //片元着色器核心任务,返回渲染的颜色
}
ENDCG
{
Pass {
//其他Pass
}
}
SubShader{
//其他SubShader
}
FallBack "Diffuse" //或FallBack "VertexLit"或FallBack Off
}
第4章 学习Shader所需的数学基础
- 模型空间,世界空间->左手坐标系,观察空间->右手坐标系
|
|