Unity Shader語法
Unity Sahder 包括固定着色器、表面着色器、可編程着色器(頂點着色器、表面着色器),這裏只討論可編程着色器,同時便於自己寫shader時查閱,防止忘記。
首先列出可編程着色器的基本框架(以一半透明着色器爲例):
//爲自己的shder起名字,前面爲目錄結構
Shader "MyShader/Transparent" {
//屬性:即可在unity面板上設置的一些變量
Properties {
//主紋理
_MainTex ("Texture", 2D) = "white" {}
//顏色
_AmbientCol ("AmbientCol", color) = (0.0, 0.0, 0.0, 0.0)
_DiffuseCol ("DiffuseCol", color) = (0.0, 0.0, 0.0, 0.0)
//光向量
_LightDir ("LightDir", vector) = (0.0, 1.0, 0.0, 0.0)
}
//子着色器,可以有多個,根據設備選擇合適的着色器
SubShader {
//標籤,可有多個;包含渲染隊列,渲染類型等標籤
Tags{ "Queue" = "Transparent"}
//渲染通道,可有多個,根據需要渲染的次數來添加
Pass
{
//關閉深度寫入
ZWrite Off
//Alpha混合方式
Blend SrcAlpha OneMinusSrcAlpha
//CG語言模塊,所以說要會Cg語言纔會編寫可編程着色器
CGPROGRAM
#pragma vertex vert //定義頂點着色器入口
#pragma fragment frag //定義片段着色器入口
#include "UnityCG.cginc" //包含該模塊,使用內置的Cg函數
//定義頂點着色器入口的結構體
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
//定義頂點着色器輸入到片段着色器的結構體
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : TEXCOORD1;
};
//着色器中使用的外部變量
uniform sampler2D _MainTex;
uniform float4 _AmbientCol;
uniform float4 _DiffuseCol;
uniform float4 _LightDir;
//頂點着色器
v2f vert (appdata v) : SV_POSITION
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); //計算投影后的座標
o.color = _DiffuseCol * dot(normalize(v.normal), normalize(_LightDir));
o.uv = v.uv;
return o;
}
//片段着色器
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
col *= i.color;
col += _AmbientCol + float4(0.0, 0.0, 0.0, 0.5);
return col;
}
ENDCG
}
}
//默認着色器,當自定義着色器不能運行時,運行該着色器
FallBack "Diffuse"
}
注意事項
此處使用”ZWrite Off;”是因爲此處渲染的爲透明物體,如果不關閉深度緩存寫入,此透明物體就會覆蓋後面的物體,而不是跟後面的物體混合!
所以說,透明物體一定要在後面的物體渲染過後渲染,並且要關閉深度寫入
- 關於CG中的語義POSITION與SV_POSITION的區別,推薦這篇文章
- 關於屬性變量選擇可以看着張圖片(來自馮樂樂的Unity Shader入門精要)
有問題歡迎大家拍磚,畢竟我也還在學習中,會後續更新其它注意事項以及其它需要查閱的東西
Reference:
1.Unity Shader入門精要 馮樂樂.pdf
2.http://blog.csdn.net/zhao_92221/article/details/46797969