本章主要參考《Unity Shaders and Effects Cookbook》一書,感謝原書作者提供的學習資料
一、爲表面着色器添加屬性
着色器的屬性在渲染管道過程中是很重要的,因爲它們是一個接口可以讓使用着色器的美工或用戶指定紋理和調整着色器的值。屬性可以作爲GUI元素暴露在材質的Inspector面板上,而不是單獨的編輯器,它提供了可視化的方法供你調整着色器。
二、如何操作
每個Unity着色器都擁有一個內置結構,這些Properties塊也是Unity所希望帶給你的功能之一。這樣做的原因是希望給用戶提供一種快捷方式來創建GUI元素並和着色器代碼綁定。在Properties塊中聲明的屬性可以在接下來的代碼裏用於調整值,顏色或者紋理
三、在表面着色器中使用屬性
_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
_AmbientColor ("Ambient Color", Color) = (1,1,1,1)
_MySliderValue ("This is a Slider", Range(0,10)) = 2.5
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
3.完成第二步驟之後,你就可以在着色器裏使用屬性值了。我們把_EmissiveColor的屬性值加到_AmbientColor上,然後把計算結果賦值給o.Albedo。將以下代碼加如到surf函數void surf (Input IN, inout SurfaceOutput o)
{
float4 c;
c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);
o.Albedo = c.rgb;
<span style="white-space:pre"> </span>o.Alpha = c.a;
}
Shader "liulongling/BasicDiffuse" {
Properties
{
_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
_AmbientColor ("Ambient Color", Color) = (1,1,1,1)
_MySliderValue ("This is a Slider", Range(0,10)) = 2.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
float4 c;
c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}