如以下代码所示,这章主要知识点是熟悉shaderlab的格式。
其中语义比较难理解。
Shader "Unity Shaders Book/Chapter 5/Simple Shader"
{
Properties
{
_Color ("Color Tint",Color) = (1.0,1.0,1.0,1.0)
//不要加分号MD 声明一个属性_Color,类型是Color,初始值对应白色
}
SubShader
{
Pass
{
CGPROGRAM //CG代码起始位置
#pragma vertex vert
//声明一个顶点着色器,作用于每个顶点,通常是处理从世界空间到裁剪空间(屏幕坐标)的坐标转换,后面紧接的是光栅化。
#pragma fragment frag
//声明一个片元着色器,作用于每个屏幕上的片元(这里可近似理解为像素),通常是计算颜色。
fixed4 _Color;
struct a2v
{
float4 vertex : POSITION; //POSITION,全部大写的是CG/HLSL提供的语义
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
};
v2f vert(a2v v) //顶点着色器
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
//v.normol包含了顶点的法线方向,分量范围在【-1,1】
//乘0.5之后变成【-0.5,0.5】 和后面的向量相加 color分量变成【0,1】
return o; //输出一个记录了顶点数据的结构体
}
fixed4 frag(v2f i) : SV_Target //片元着色器:将顶点中的颜色数据插值后输出
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1.0);
}
//SV_target:片元着色器输出时Unity支持的常用语义,输出值会被存储到渲染目标中(render target)
ENDCG
}
}
}
//PS:在片元函数中输出的只能是 COLOR语义的数据(SV_Target SV开头的是系统语义,渲染器要用他们来完成特定事情,这里等同于COLOR语义
//顶点函数输出的必须包含 POSITION语义的数据,当然也可以包含是其他数据类型,不过一旦涉及输入输出都是需要语义的
效果如图
知识点补充:
1.fixed是CG中最低精度的浮点值,还有half,float都表示浮点值。
2.减少在shader中流程控制语句的使用。
3.在某些平台上只支持SV开头的系统语义变量输出,所以尽量使用系统语义。