Shader Lab 是shader language的抽象,只能在unity中使用.
语义syntax是其基本结构,{}内的内容。
Shader "ShaderName"//shader的名字以及在材质面板的显示
{
//材质和shader的沟通
Properties
{
//NameInShader("NameInMaterial",Propertype) = DefaultValue;
//Properties只有一下几种,声明方式固定
// Numbers and Sliders
_Int ("Int", Int) = 2
_Float ("Float", Float) = 1.5
_Range("Range", Range(0.0, 5.0)) = 3.0
// Colors and Vectors
_Color ("Color", Color) = (1,1,1,1)
_Vector ("Vector", Vector) = (2, 3, 6, 1)
// Textures
_2D ("2D", 2D) = "" {}
_Cube ("Cube", Cube) = "white" {}
_3D ("3D", 3D) = "black" {}
}
//最重要的模块,包含至少一个subshader,unity扫描所有subshader找到第一个能在目标平台使用的shader,没有就使用Fallback。
SubShader
{
//RenderSetup
//Cull,Ztest,ZWrite,Blend
//Tags{"TagName1 = "Value1"}
//SubShade的Tags是一组键值对
//Queue队列,RenderType渲染类别,DisableBatching关闭批处理
//ForceNoShadowCasting关闭阴影,IgnoreProjector无视投影(用于透明物体)
//CanUseSpriteAtlas,PreviewType材质框中预览模型,可以是"Plane""Sphere"
//一个Pass是一个完整渲染流程,Pass过多影响性能。
Pass{}
}
SubShader
{
//真正的Shader代码
//表面着色器Surface Shader
//顶点片元着色器
//固定函数着色器
}
//最后一道防线,如果以上SubShader都不能用就只能用最低级的。不写就是不管了
Fallback "VertexLit"
}
表面着色器Surface Shader
这是Unity独创的shader类型,本质上还是顶点片元着色器,在其基础上进行抽象。
代码量少,Unity处理了许多细节。
SubShader
{
Tags{"RenderType" = "Opaque"}
CGPROGRAM
#Pragma surface surf Lambert
struct Input{float4 color : COLOR;};
void surf(Input IN, inout SurfaceOutput o){o.Albedo = 1;}
ENDCG
}
Surface Shader中的语义块在CGPROGRAM和ENDCG之间,而不是Pass。CGPROGRAM和ENDCG之间使用CG/HLSL。
顶点片元着色器Vertex/Fragment Shader
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert;
#pragma fargment frag;
float4 vert(float4 v : POSITION) : SV_POSITION
{
return mul (UNITY_MATRIX_MVP,v);
}
fixed4 frag() : SV_Target
{
return fixed4(1,0,0,1);
}
ENDCG
}
}
Pass{}中实现。CGPROGRAM和ENDCG之间使用CG/HLSL。灵活性更高。
固定函数Fixed Function Shader
时代眼泪,不写了。