本文參考unity3d官方API:https://docs.unity3d.com/Manual/ShaderTut1.html
首先写一个最简单示例代码如下:
Shader "Custom/FixedFunctionShader"
{
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
}
}
}
}
然后,有这样的效果:
虽然能正确显示,但是这个时候,是不能调节显示的颜色的,因为我们所看到的东西都是有光来决定的,因此我们要继续加代码:
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
}
Lighting on
}
Ambient的顔色在一般情况下都是与物体的颜色采用同一个参数,而“”Lighting on“”是设置光的渲染,让Ambient起作用。
然后就有如下的效果了:
我把颜色设置成了红色,可以看到,有了明暗的变化等的效果。
然后,我们继续添加代码,增加高光的效果:
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
_SpecularColor("SpecularColor", color) = (1, 1, 1, 1)
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
Specular[_SpecularColor]
}
Lighting on
SeparateSpecular on
}
}
Specular与SeparateSpecular的作用与前面的Ambient与Lighting的指令一样,是unity内置的对于shader编程的指令。
现在可以看到有如下的效果:
可以看到,有非常明显的锯齿效果,为了消除这个,我们继续添加代码:
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
_SpecularColor("SpecularColor", color) = (1, 1, 1, 1)
_Shininess("Shininess", Range(0.01, 0.1)) = 0.7
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
Shininess[_Shininess]
Specular[_SpecularColor]
}
Lighting on
SeparateSpecular on
}
}
然后调节一下参数后,会呈现如下的效果:
然后继续添加自发光的效果:
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
_Shininess("Shininess", Range(0.01, 0.1)) = 0.7
_Emission("Emission Color", color) = (1, 1, 1, 1)
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
Shininess[_Shininess]
Specular[_SpecularColor]
Emission[_Emission]
}
Lighting on
SeparateSpecular on
}
}
调节参数,效果如下,第一张的是在有光的情况的,第二张的是没有光的情况下的:
然后,我们继续添加代码,添加一个可以使用贴图的功能:
Shader "Custom/FixedFunctionShader"
{
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
_Shininess("Shininess", Range(0.01, 0.1)) = 0.7
_Emission("Emission Color", color) = (1, 1, 1, 1)
_MainTex("Main Tex", 2d) = "white" {}
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
Shininess[_Shininess]
Specular[_SpecularColor]
Emission[_Emission]
}
Lighting on
SeparateSpecular on
SetTexture[_MainTex]
{
Combine texture * primary
}
}
}
}
添加的SetTexture[_MainTex]的命令也是unity内置的,它可以应用一张贴图, combine是结合之前的计算再与贴图一起作用于材质球,你
也可以在primary的后面添加一个double,来提高亮度。效果如下:
使用的贴图:
添加了double的效果:
然后,再继续添加多一张贴图:
Shader "Custom/FixedFunctionShader"
{
Properties
{
_Color("Color", color) = (1, 1, 1, 1)
_SpecularColor("Specular Color", color) = (1, 1, 1, 1)
_Shininess("Shininess", Range(0.01, 0.1)) = 0.7
_Emission("Emission Color", color) = (1, 1, 1, 1)
_MainTex("Main Tex", 2d) = "white" {}
_SecondTex("Second Tex", 2d) = "white" {}
}
SubShader
{
Pass
{
Material
{
DIFFUSE[_Color]
Ambient[_Color]
Shininess[_Shininess]
Specular[_SpecularColor]
Emission[_Emission]
}
Lighting on
SeparateSpecular on
SetTexture[_MainTex]
{
Combine texture * primary double
}
SetTexture[_SecondTex]
{
Combine texture * previous double
}
}
}
}
这就是最终的代码了。最后的previous命令是unity内置的,用于处理多张贴图的指令。
效果如下: