Unity Shader入门
Shader代码基本结构
Shader "MyShaderName" {
Properties{
// 属性
}
SubShader{
// 针对显卡A的SubShader
Pass{
// 设置渲染状态和标签
// 开始Cg代码片段
CGPROGRAM
// 该代码片段的编译指令,例如:
#pragma vertex vert
#pragma fragment frag
// Cg代码写在这里
ENDCG
// 其他设置
}
// 其他需要的Pass
}
SubShader{
// 针对显卡B的SubShader
}
// 上述SubShader都失败后用于回调的Unity Shader
Fallback "VertextLit"
}
具体类似代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "MyCustom/SimpleShader" {
Properties{
_Color("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
// 使用一个结构体来定义顶点着色器的输入
struct a2v{
// POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量
float4 vertex : POSITION;
// NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量
float3 normal : NORMAL;
// TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
float4 texcoord : TEXCOORD0;
};
// 使用一个结构体来定义顶点着色器的输出
struct v2f{
// SV_POSITION语义告诉Unity,pos里面包含了顶点在裁剪空间中的位置信息
float4 pos : SV_POSITION;
// COLOR0语义可以用于存储颜色信息
fixed3 color : COLOR0;
};
// POSITION告诉Unity把模型的顶点坐标填充到输入参数v中
// SV_POSITION告诉Unity,顶点着色器的输出是裁剪空间中的顶点坐标
// float4 vert(float4 v : POSITION) : SV_POSITION{
// return UnityObjectToClipPos(v);
// }
// float4 vert(a2v v) : SV_POSITION{
// // 使用v.vertex来访问模型空间的顶点坐标
// return UnityObjectToClipPos(v.vertex);
// }
// // SV_Target等同于告诉渲染器,把用户的输出颜色存储到一个渲染目标(render target)中
// // 这里将输出到默认的帧缓存中
// fixed4 frag() : SV_Target{
// return fixed4(1.0, 1.0, 1.0, 1.0);
// }
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
fixed4 frag(v2f i) : SV_Target {
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c, 1.0);
}
ENDCG
}
}
}