本章主要参考《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"
}