“The best things are the most difficult.”
– Plutarch, Greek Historian
这一节我们将法线贴图放进shader
Shader"Example / AutisticPatient SurfaceShader3"
{
Properties
{
_MainTex("MainTex",2D) = "white"{}
//如果你想在这里放入法线贴图,那么初始值一定要是Bump
_BumpMap("BumpMap",2D) = "Bump"{}
}
SubShader
{
Tags{"RenderType" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
};
sampler2D _MainTex;
sampler2D _BumpMap;
void surf(Input IN,inout SurfaceOutput o)
{
//tex2D是CG程序中用来对一张贴图(这里是_MainTex)中对一个点(IN.uv_MainTex)进行采样的方法
//返回一个float4类型,并将其颜色的rgb值赋给了输出的像素颜色
//总的来说,着色器会找到贴图上对应的UV坐标点,直接使用这个点的颜色信息rgb来进行着色.
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
//这里同理
//unpcakNormal是接受fixed4类型的变量,然后转化为三维法线向量(fixed3)再赋值给标准输出结构体的Normal
o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));
}
ENDCG
}
FallBack"Diffuse"
}
下面是效果图
模型师asset store上down的 感谢美术前辈的免费分享
*step2*
接下来是边缘光效果(RimLighting)
部分代码跟以前重复,就直接copy了
Shader "Example/Rim"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
_RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0) //边缘发光颜色 Rim Color
_RimPower ("Rim Power", Range(0.5,8.0)) = 3.0 //边缘发光强度 Rim Power
}
SubShader
{
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
//viewDir(内置的变量) 定义了视角方向
//内置变量还有很多,以后用到了再说,大家也可以自行查阅
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
void surf (Input IN, inout SurfaceOutput o)
{
//tex2D是CG程序中用来对一张贴图(这里是_MainTex)中对一个点(IN.uv_MainTex)进行采样的方法
//返回一个float4类型,并将其颜色的rgb值赋给了输出的像素颜色
//总的来说,着色器会找到贴图上对应的UV坐标点,直接使用这个点的颜色信息rgb来进行着色.
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
//unpcakNormal是接受fixed4类型的变量,然后转化为三维法线向量(fixed3)再赋值给标准输出结构体的Normal
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
//normalize用于获取到的viewDir坐标转成一个单位向量且方向不变
//然后在与点的法线做点积运算
//最外层再用saturate算出[0,1]之间的最靠近(最小值但大于所指的值)的值。这样算出一个rim边界。
//这里o.Normal就是单位向量,viewDir经过转化也是单位向量,所以夹角越小,cos值越大,反射上来的光也就越少,
//这时候取反(也就是用1减去值)得到的值也就越小
//取反是为了方便在Inspector面板中进行调试
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
//自发光,它直接从物体发出并且不受任何光源影响,
//把这个值的变化率用一个pow函数(rim的_rimPower次方)进行放大,就能强化边缘发亮的效果.
//大家可以把pow函数去掉试试效果
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
}
ENDCG
}
Fallback "Diffuse"
}
这里就不上效果图了 , 本身代码很简单,,而且 太晚了,,明天再继续
我总感觉倒数第二句代码的解释有点问题,如果路过的各位前辈能够知道下也是极好的呀( ⊙ o ⊙ )!