写这篇文章主要是帮助自己理解代码的框架结构以及变量、函数的使用,旨在理解框架和流程,不对变量和函数进行详细解析;认知是不断刷新的,故这篇文章只能起到一种抛砖引玉的效果。
1、Shader“名字”(可加目录/名字)
注意:Shader“名字”!=Shader文件名字
2、材质和Unity Shader的桥梁:Properties语义块
该语义块包括了一系列的属性。
定义:属性名称("Unity面板中显示名称",指定类型)=默认数值
如下图:包括了常用的属性值:浮点型、范围、四维参数、颜色值、贴图
显示效果:
3、SubShader语义块(可以有多个,至少有一个)
SubShader{
//[]内可选
[Tags]//字符串键/值对,SubShader与渲染引擎之间的沟通桥梁
//它们用来告诉Unity的渲染引擎:我希望怎样以及何时来渲染这个对象
[RenderSetUp]//渲染状态的设置指令,可以设置显卡的各种状态
Pass//定义了一次完整的渲染流程(但如果Pass数目过多,往往会造成渲染性能的下降)
{
CGPROGRAM//与ENDCG相呼应,是UnityCG所要求的格式
//在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量
//!!!!一定是匹配的名字!!!!
//可以通过Unity的面板传入Shader中
float4 _Color;
#pragma vertex vert//顶点着色器,逐顶点执行
#pragma fragment frag//片元着色器
#include "UnityCG.cginc"//引入Unity的头文件
ENDCG
}
Fallback "name"/Off
//为“name”时:用于告诉Unity,如果上面所以SubShader在这块显卡上都不能运行,
那就使用这个最低级的Shader吧!例:Fallback "VertexLit"
//为“Off”时:如果一块显卡都跑不了上面所以的SubShader,那就不要管它了!
}
4、SubShader中的结构体:
//application to vertex shader (将模型数据从应用阶段传递到顶点着色器)
struct a2v {
float4 vertex :POSITION;//float4类型获取语义POSITION(模型的顶点坐标)
float3 normal :NORMAL;//模型的顶点法线
float4 texcoord:TEXCOORD0; //纹理
};
//vertex shader to fragment shader(将数据从顶点着色器传递到片元着色器)
struct v2f {
float4 pos:SV_POSITION;
//SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
};
5、顶点/片元着色器:
顶点着色器:将物体从Object Space经过MVP矩阵变换到Clip Space
下图一步步变换:
在查阅2022.3版本的Unity手册时,发现Unity有新的方法可以“一步到位”,直接将数据从对象空间转换到裁剪空间:UnityObjectToClipPos();
struct v2f {
float4 pos:SV_POSITION;
//SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
};
//顶点着色器vert:传入模型数据——图元装配
v2f vert(a2v v)
{
v2f o;
float4 pos_world=mul(_Object2World,v.vertex);//模型空间转世界空间
float4 pos_view=mul(UNITY_MATRIX_V,pos_world);//世界空间转相机空间
float4 pos_clip=mul(UNITY_MATRIX_P,pos_view);//转到裁剪空间
o.pos=pos_clip;
return o;//返回数据给顶点着色器所需结构体v2f
}
//片元着色器frag:返回float4类型的颜色值 SV_Target为渲染对象——光栅(像素)化
float4 frag(v2f i):SV_Target
{
//较简单的返回值
return _Color;
}
用通俗一点的理解:a2v实现了将"模特"从”家“中请到了摄影棚(获取模型数据),v2f实现了为模特打上灯光、加上特效(为模型实现效果)
参考文章:
Unity Shder入门精要
【TA入门】CS0102:Shader代码入门基础_哔哩哔哩_bilibili
更多Unity变量:Unity - Manual: Built-in shader variables (unity3d.com)
更多Unity语义:Unity - Manual: Providing vertex data to vertex programs (unity3d.com)