写在前面

既然想要实现云的消散效果,那么边缘光如何计算也是一个重点。

在Unity Shader入门精要的14章,介绍轮廓线渲染就介绍了——轮廓边检测,而边缘光也是需要先检测出轮廓边再进行的。

Unity3D Shader系列之边缘光RimLight

这篇博客给了我很大的启发,引言部分说了为什么花了很长时间把渲染管线、坐标变换这些基础的东西学清楚了,想要实现某种效果的时候还是要重新学习——欠缺算法知识。感觉还是要去主动想实现某种东西再有针对性的学习,这样学习得才更加深刻。

...有些扯远了,这篇文章简简单单实现边缘光,为之后实现云消散做铺垫,当然,卡通渲染边缘光还有很多讲究,包括描边也有很多需要学习的,之后再涉及。

1 简单的算法介绍

判断边缘

边缘光跟轮廓线渲染异曲同工,其核心都是找到边缘,而找边缘的算法原理很简单:当视线看向物体边缘的时候,视线与边缘的顶点法线是垂直的(很好理解吧!),那么我们依靠视线方向和模型面片法线的点积就能实现边缘判断,所以一切的核心最终凝炼成了:

// 点积
dot(worldNormal, worldViewDir);

判断是边缘后,叠一层边缘光颜色就行。

2 shader中实现

写过一点点shader的或许都有这样一种感觉:有时候明明道理很简单,但在frag里实现时又需要添加一些范围限定的函数(pow/saturate那些),才能得到最终的效果,这里也不例外:

// 1.点积
dot(worldNormal, worldViewDir);
// 2.(1 - 点积结果)&&(加个saturate控制到0,1之间)
saturate(1 - dot(worldNormal, worldViewDir));

叠加必要的_RimColor和_RimIntensity,这样的话在shader中就是:

fixed4 rimLight = _RimColor * saturate(1 - dot(worldNormal, worldViewDir));

Shader中代码:

Shader "Unlit/rim"
{Properties{_BaseColor ("Base Color", Color) = (0,0,0,0)_RimColor ("Rim Color", Color) = (0,0,0,0)_RimPower ("Rim Power", Range(0.0001, 5.0)) = 1.0_RimIntensity ("Rim Intensity", Range(0, 100.0)) = 1.0}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 worldNormal : TEXCOORD1;float3 worldViewDir : TEXCOORD2;};fixed4 _BaseColor;fixed4 _RimColor;float _RimIntensity;float _RimPower;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldViewDir = WorldSpaceViewDir(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldViewDir = normalize(i.worldViewDir);fixed4 diffuse = _BaseColor;fixed4 rimLight = _RimColor * saturate(1 - dot(worldNormal, worldViewDir)) * _RimIntensity;//fixed4 rimLight = _RimColor * pow(saturate(1 - dot(worldNormal, worldViewDir)), 1.0 / _RimPower) * _RimIntensity;fixed3 col = diffuse.rgb + rimLight.rgb;return fixed4(col,1.0);}ENDCG}}
}

效果:

衰减效果

原本的效果其实是没有什么衰减而言的,但是边缘光其实应该有个过渡效果,用上pow()就能实现啦。

算上pow:

fixed4 rimLight = _RimColor * pow(saturate(1 - dot(worldNormal, worldViewDir)), 1.0 / _RimPower) * _RimIntensity;

效果:

【Cel-Shading】边缘光的实现 | Invictus maneo (x-wflo.github.io) 中有说遇到的问题

【Unity云消散】理论基础:实现边缘光相关推荐

  1. Unity 使用Fresnel Effect实现边缘光

    转载注明出处:点击打开链接 这篇文章主要讲述在ShaderGraph中FresnelEffect节点在3d视觉效果中的常见使用场景. 用于一些光滑程度较高的物体判断物体表面反射的强度,例如延伸的湖面, ...

  2. 【Unity云消散】理论基础:实现SDF的8SSEDT算法

    距离元旦假期已经过去5天了(从31号算起!),接着开始学习! 游戏中的很多渲染效果都离不开SDF,那么SDF究竟是什么呢?到底是个怎么样的技术?为什么能解决那么多问题? 1 SDF SDF,即sign ...

  3. 【Unity云消散】巩固step,lerp和smoothstep

    之前在学习HLSL常用函数时就有涉及到范围相关的函数,但是最近做的东西发现step,lerp和smoothstep这三个函数总是一直在用,总是会在用的时候突然忘记他们分别是干啥的,这里就记录一下方便查 ...

  4. 【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

    写在前面 写在前面唉,最近筋疲力竭,课题组的东西一堆没做,才刚刚开始带着思考准备练习作品,从去年5月份开始到现在真得学了快一年了,转行学其他的真的好累,,不过还是加油! 下面是做面片云的部分,关于日月 ...

  5. unity镜头边缘羽化_【JTRP】屏幕空间深度边缘光 Screen Space Depth Rimlight

    氵一篇最近群友聊到的新边缘光,使用深度计算,相对于传统边缘光可能更适合硬表面. https://github.com/Jason-Ma-233/JasonMaToonRenderPipelinegit ...

  6. 【unity shader】unity游戏特效-遮挡显示效果 (含边缘光、描边效果版)

    不知道你们有没有在玩Black Squad这个游戏啊 在被对手干掉时会有敌人高亮显示效果 (未被做掉时) (被做掉后高亮显示敌人位置) 明明敌人被不透明物体挡住却仍然可以被渲染出来 这效果要是能扔进自 ...

  7. unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光

    先上一张图片,看下实际效果 1:黑色为模型主color 2:白色为内发光,轮廓内边缘光 3:红色为外发光,轮廓外边缘光 Shader "Unlit/边缘光" {Properties ...

  8. Unity Shader 表面着色器边缘光(Rim Lighting)二

    这一节我们要实现下面的效果 (图一) (图二) 首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球. 我们只需要在鼠标进入的时候把材质的Shader换成带边缘光的S ...

  9. Unity Shader Graph 制作Rim Light边缘光效果

    效果图: 模型为Asset Store资源商店中免费资源Robot Kyle机器人 实现原理: 通过法线方向和视线方向的夹角来判断点是否处于边缘,从而给其增加边缘光,视线方向和法线方向垂直时,则该点在 ...

最新文章

  1. 关于WPF的ComboBox中Items太多而导致加载过慢的问题
  2. 【连载】优秀程序员的 45 个习惯之习惯27
  3. c++ argmax
  4. GMIS 2017大会Wesly Mukai演讲:智能运输的未来
  5. python slice函数画高维图_Python 绘制 3 维以上的高维图
  6. hive 自定义元数据表_Hive分区表和桶表的使用
  7. python 输入数字变成密码_如何在python中检查数字的“密码”
  8. 朋友圈、浏览器分享实现
  9. Libbpf-tools: Tracing工具
  10. 开热点给电脑消耗大吗_你试过爬楼梯减肥吗?热量消耗大,选对姿势很重要!...
  11. leetcode 456. 132 Pattern 132模式 题解(栈)
  12. Dagger2和MVParms的学习
  13. 程序员开发者常用必备网站汇总推荐
  14. 阿里笔试题解(2020.4.17场)
  15. 千锋2015.04月最新C语言基础视频教程
  16. kux播放器android,kux格式转换工具
  17. 维修记录java_维修保养记录
  18. Openlayer 切换鼠标样式
  19. 青龙脚本--联通领话费流量等
  20. 使用ajax实现页面分页

热门文章

  1. 《使用第三方库来显示jpeg图片》
  2. java 十六进制负数_Java 十六进制转十进制正负数
  3. (十八)用JAVA编写MP3解码器——迷你播放器
  4. 腾讯云企业网盘正式入驻数字工具箱
  5. VCC、 VDD、VEE、VSS 电压理解
  6. Ja进av阶书籍推荐
  7. Codeforces Round #750 (Div. 2)A-F1补题题解
  8. java 控制台输出时间_Java获取时间打印到控制台代码实例
  9. 2021最新全球CS专业排名发布,CMU再夺榜首,清华和MIT并列第三!
  10. 护眼灯到底有用吗?2022市面上这几款护眼灯真的能护眼