打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Shader之LimLighting

//本人菜鸟,欢迎讨论。
Shader "Custom/OfficialExam4_RimLighting" 

{
 Properties { _MainTex ("Base (RGB)", 2D) = "white" {}
 _BumpMap("Bump (RGB)",2D) = "white"{} 
 _RimColor("Rim Color",Color) = (0.26,0.19,0.16,0.0)
 _RimPower("Rim Power",Range(0.5,8.0)) = 3.0
 } 

 SubShader 
{
 Tags { "RenderType"="Opaque" } 
 LOD 200

 CGPROGRAM #pragma surface surf Lambert 

 sampler2D _MainTex; 
 sampler2D _BumpMap;
 float4 _RimColor; 
 float _RimPower; 

 struct Input 
 float2 uv_MainTex; 
 float2 uv_BumpMap;
 float3 viewDir;
}; 

 void surf (Input IN, inout SurfaceOutput o)
 {
 o.Albedo = tex2D(_MainTex,IN.uv_BumpMap).rgb; 
 o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap)); 
 half rim = 1.0 - saturate(dot(normalize(IN.viewDir),o.Normal)); 
 o.Emission = _RimColor.rgb * pow(rim,_RimPower); 
 }
 ENDCG
 } 
 FallBack "Diffuse"
 }  
viewDir:即world space view Direction(我的理解为camera方向)
最里层是Normalize函数,用于获取到的viewDir坐标转成一个单位向量且方向不变,外面再与点的法线做点积。最外层再用saturate算出一[0,1]之间的最靠近(最小值但大于所指的值)的值。这样算出一个rim边界。
为什么这么做。原理以下解释:=>看图。
 
 
 =>这里o.Normal就是单位向量。外加Normalize了viewDir。因此求得的点积就是夹角的cos值。=>因为cos值越大,夹角越小,所以,这时取反来。这样,夹角越大,所反射上的颜色就越多。于是就得到的两边发光的效果。 当dot(...)<0时,saturate处理之后,就会等于0。这样处于背面的位置就不会有Emission效果。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Unity shader 官网文档全方位学习(一)
【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader...
【Unity Shader实战】利用凹凸纹理和边缘光模拟全息投影的效果
边缘高光(附上代码)
猫都能学会的Unity3D Shader入门指南(一)
Unity3D Shader入门指南(二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服