1,渲染流水线
1,流水线
2,模板测试通常用于限制渲染的区域,也可用于渲染阴影、轮廓渲染等。
3,关闭混合操作后,通过测试的颜色会直接覆盖颜色缓冲区中的值,适用于不透明的物体。
4,批处理思想:将多个小的DrawCall合并成一个大的DrawCall
2,UnityShader基础
1,UnityShader 结构
基本结构
Shader "Shader名称"
{
Properties
{//属性
}
SubShader
{//显卡A使用的子着色器
}
SubShader
{//显卡B使用的子着色器
}
FallBack "VertexLit"
}
进一步
Shader "命名空间\Shader名称"
{
Properties
{
//属性
Name("display name",PropertyType) = DefaultValue
//eg. _Color("Main Color",Color) = (1,1,1,1)
}
SubShader //显卡A使用的子着色器
{
[Tags{"标签1"="值1" "标签2"="值2"}] //可选
//eg. Tags{"Queue"="Transparent" "RenderType" = "Opaque" }
[RenderSetUp] //可选,状态同样可在Pass块中声明,如果在SubShader中声明,则适用于所有Pass
//eg. Cull off
Pass
{
[Pass名称] //可选
[Tags] //可选
[RenderSetUp] //可选,同上面RenderSetUp
CGPROGRAM
//编译指令,如:
#pragma vertex funName1 //告诉Unity哪个函数(funName1)包含了顶点着色器的代码
#pragma fragment funName2 //告诉Unity哪个函数(funName2)包含了片元着色器的代码
//Cg代码
ENDCG
}
}
SubShader
{//显卡B使用的子着色器
}
FallBack "VertexLit"
}
(1)Property类型
(2)SubShader中的标签(Tags)
(3)渲染状态设置(RenderSetUp)
(4)Pass中的标签
2,Pass结构
Pass
{
[Pass名称] //可选
[Tags] //可选
[RenderSetUp] //可选,同上面RenderSetUp
CGPROGRAM
//编译指令,如:
#pragma vertex funName1 //告诉Unity哪个函数(funName1)包含了顶点着色器的代码
#pragma fragment funName2 //告诉Unity哪个函数(funName2)包含了片元着色器的代码
//Cg代码
//定义结构体
struct 结构体名称
{
类型1 名称1:语义1
类型2 名称2:语义2
...
}
//eg.
//struct a2v
//{
// float4 vertex:POSITION
// float3 normal:NORMAL
// ...
//}
// 通过语义POSITION告诉Unity将模型顶点坐标填充到v中,模型顶点数据来自于定义的结构体
// 通过语义SV_POSITION告诉Unity该函数输出的是裁剪空间下的顶点坐标
float4 funName1(float4 v:POSITION):SV_POSITION
{
return mul(UNITY_MATRIX_MVP,v);
}
fixed4 funName2():SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
(1)给Pass起名后可在其他Shader中通过UsePass "Pass名称"
命令引用该Pass,但Pass名称需大写,如UsePase "MyShader\PASSNAME"
(2)Unity支持的语义:
从应用阶段传递到顶点着色器:
POSITION、TANGENT、NARMAL、COLOR、TEXCOORDn
从顶点着色器传递到片元着色器:
SV_POSITION、COLOR0、COLOR1、TEXTURE0~TEXTURE7
输出语义:
SV_Target
3,属性
(1)属性并不是必须在Properties中声明才可使用的,在CG代码中定义后即可使用
(2)在Properties中声明属性只是为了将其在材质面板中可视化
(3)在CG中定义属性时,名称和类型需与在Properties中声明的保持一致,如声明并使用一个名称为“_Color”的属性(Properties中类型为Color对应CG中类型为fixed4):
Shader "MyShader"
{
Properties
{
_Color("颜色",Color)=(1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
fixed4 _Color;
......
ENDCG
}
}
}
3,标准光照模型
输出=自发光+环境光+高光反射+漫反射
(1)漫反射