12-10-2014
在Surface Shader中我们需要将Properties与Shader代码进行绑定,这样在Material的Inspector标签中修改属性值才会对Shader产生影响。
下面的步骤告诉我们在Surfaces Shader中如何使用Properties:
- 打开之前创建的Shader文件,删除下面的代码
sampler2D _MainTex; half4 c = tex2D (_MainTex, IN.uv_MainTex);
- 在CGPROGRAM行下面添加下面的代码:
float4 _EmissiveColor; float4 _AmbientColor; float _MySliderValue;
- 上面两步完成后我们就能在Shader中使用我们的属性了。我们将_EmissiveColor和_AmbientColor相加然后做_MySlideValue次幂运算,然后将值赋值给o。我们在surf函数中加入如下代码:
void surf (Input IN, inout SurfaceOutput o) { float4 c = pow(_EmissiveColor + _AmbientColor, _MySliderValue); o.Albedo = c.rgb; o.Alpha = c.a; }
- 最后我们的代码应该如下所示。保存代码后,Unity会自动编译。确保你的代码正确,如果你已经将Materail指定到Object上,你会发现改变Inspector标签中的属性值,Object的颜色会发生变化。是不是很有意思!
Shader "Imakiba/BasicDiffuse" { Properties { _EmissiveColor ("Emissive Color", Color) = (1,1,1,1) _AmbientColor ("Ambient Color", Color) = (1,1,1,1) _MySliderValue ("This is a Slider", Range(1,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 = pow(_EmissiveColor+_AmbientColor,_MySliderValue); o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
上面的代码中,我们使用到了pow(x,y)这个方法,这是一个内建函数运算的结果为xy。
想知道pow()方法的更多信息,可查看Cg文档,里面提供了各种资源来学习Shader还有API来学习Cg Shading 语言。
http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_e.html