unity3d 之 边缘光(rim)
2015-12-20 20:07
721 查看
边缘光在游戏中是很常用到的,比如角色受到攻击,模型边缘会有一圈红色的边框,这些都是边缘光得到的奇妙效果。下图展现了边缘光的效果
边缘关的原理如下图所示
代码如下图
然后可以通过简单的代码进行shader的切换,进行模拟角色被攻击的效果 (略)
可能还有这样一个情景,当角色受到攻击的时候,不仅要边缘高光,而且可以从身体看穿,看到身后的物体,这样可以增加真实感。这里实现这个其实很简单 (如下效果)
左边的是边缘光带透明的,右边是只有边缘光的 代码如下,只需要加入简单的混合方式和 队列顺序
边缘关的原理如下图所示
代码如下图
Shader "Custom/Rim" { Properties { //对边缘光做一个衰减 _Scale("RIM_SCALE", range(1, 8)) = 2 } SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" float _Scale; struct v2f{ float4 pos: SV_POSITION; float3 normal: TEXCOORD0; float4 vertex: TEXCOORD1; }; //收集模型法线和顶点,并返回 v2f vert(appdata_base v){ v2f vf; vf.pos = mul(UNITY_MATRIX_MVP, v.vertex); vf.normal = v.normal; vf.vertex = v.vertex; return vf; } fixed4 frag(v2f IN):color{ //下面的两个函数都是unitycg.cginc的, //UnityObjectToWorldNorm 作用是把 法线 转到 世界空间 float3 N = UnityObjectToWorldNorm(IN.normal); //WorldSpaceViewDir 作用是计算相机到物体定点的向量 float3 V = WorldSpaceViewDir(IN.vertex); V=normalize(V); //计算边缘光 float bright = 1 - saturate(dot(N, V)); //衰减计算 bright = pow(bright, _Scale); //返回固定色 return fixed4(1,1,1,1) * bright; } ENDCG } } }
然后可以通过简单的代码进行shader的切换,进行模拟角色被攻击的效果 (略)
可能还有这样一个情景,当角色受到攻击的时候,不仅要边缘高光,而且可以从身体看穿,看到身后的物体,这样可以增加真实感。这里实现这个其实很简单 (如下效果)
左边的是边缘光带透明的,右边是只有边缘光的 代码如下,只需要加入简单的混合方式和 队列顺序
Shader "Custom/Rim_tranpernet" { Properties { _Scale("RIM_SCALE", range(1, 8)) = 2 } SubShader { //渲染队列为透明 tags {"Queue" = "Transparent"} pass{ //混合方式 Blend SrcAlpha oneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" float _Scale; struct v2f{ float4 pos: SV_POSITION; float3 normal: TEXCOORD0; float4 vertex: TEXCOORD1; }; v2f vert(appdata_base v){ v2f vf; vf.pos = mul(UNITY_MATRIX_MVP, v.vertex); vf.normal = v.normal; vf.vertex = v.vertex; return vf; } fixed4 frag(v2f IN):color{ float3 N = UnityObjectToWorldNorm(IN.normal); float3 V = WorldSpaceViewDir(IN.vertex); V=normalize(V); float bright = 1 - saturate(dot(N, V)); bright = pow(bright, _Scale); return fixed4(1,1,1,1) * bright; } ENDCG } } }
相关文章推荐
- unity 常用优化技术
- (转)Unity笔记之编辑器(UnityEditor)
- (转)Unity笔记之编辑器(BeginFadeGroup、BeginHorizontal、BeginScrollView) ... ...
- (转)Unity笔记之编辑器(BeginToggleGroup、BoundsField、ColorField) ...
- (转)Unity笔记之编辑器(CurveField、DoubleField、EnumMaskField、EnumPopup) ... ...
- (转)Unity笔记之编辑器(Foldout、HelpBox、InspectorTitlebar、Slider、MinMaxSlid ...
- (转)使用.NET Reflector 查看Unity引擎里面的DLL文件
- unity 内存管理
- (转)初步认识拓展UnityEditor编辑器定制
- (转)Unity3d游戏开场CG动画播放方式
- (转)Unity 导出XML配置文件,动态加载场景
- unity3d最新面试题与参考答案汇总
- unity3d面试题与参考答案
- 去蓝港在线面试Unity3D的笔试题。难吗?知道答案的在评论里写出来分享
- [转]unity3d所要知道的基础知识体系大纲,可以对照着学习,不定期更新 ... ... ... ...
- (转)Unity3D集成SVN进行版本控制
- (转载)Unity中解析ini配置文件----INIParser
- (转载)Unity3D研究院之使用 C#合成解析XML与JSON(四十一)
- Unity Text加入超链接
- 用unity3d+cardboard开发一个全景图片查看器