基于菲涅尔反射来判断边缘所在。

Shader "Custom/Test0"
{Properties{_MainColor("主颜色",Color)=(0,0,0,1)_InnerGlowColor("内发光颜色",Color)=(1,1,1,1)_InnerGlowPow("内发光等级",Range(0,5))=2_InnerGlowStrength("内发光强度",Range(0,4))=1_HaloColor("外光晕颜色",Color)=(1,1,1,1)_HaloArea("外光晕范围",Range(0,2))=1_HaloPow("外光晕等级",Range(0,3))=1_HaloStrength("外光晕强度",Range(0,4))=1}SubShader{//第一个Pass实现内发光,或者说边缘发光Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float4 _MainColor;fixed4 _InnerGlowColor;fixed _InnerGlowPow;fixed _InnerGlowStrength;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float3 normal:TEXCOORD0;float3 worldPos:TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.normal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex);return o;}fixed4 frag(v2f i):SV_Target{i.normal = normalize(i.normal);float3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos)); normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);//越边缘,值越大float fresnel = pow(1 - saturate(dot(i.normal, viewDir)), _InnerGlowPow) * _InnerGlowStrength;fixed3 color = lerp(_MainColor, _InnerGlowColor, fresnel);return fixed4(color, 1);}ENDCG}Pass{//剔除正面,防止外边缘遮住原模型,并不是所有的都需要剔除正面,比如袖子什么的//那个需要开启深度模板什么的,暂时还没学到Cull Front//混合用于控制外边缘强度Blend SrcAlpha OneMinusSrcAlpha//ZWrite off  这个用于外边缘叠加和其他物体叠加时可能会产生的透明边界的情形CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"fixed4 _HaloColor;fixed _HaloPow;fixed _HaloArea;fixed _HaloStrength;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float3 normal:TEXCOORD0;float4 worldPos:TEXCOORD1;};v2f vert(a2v v){v2f o;o.normal = UnityObjectToWorldNormal(v.normal);v.vertex.xyz += v.normal * _HaloArea;o.pos = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld, v.vertex);return o;}fixed4 frag(v2f i):SV_Target{i.normal = normalize(i.normal);//和Pass一不一样,原因是我们要把背面当正面渲染,所以视角方向要相反float3 viewDir = normalize(i.worldPos.xyz - _WorldSpaceCameraPos.xyz);//边缘仍然使用菲涅尔判断,只是和检测方式内边缘不同float fresnel = pow(saturate(dot(i.normal, viewDir)), _HaloPow) * _HaloStrength;return fixed4(_HaloColor.rgb, fresnel);}ENDCG}}
}

这种写法是建立在顶点数多的情况,而且对于模型的对称也有一定的要求。

球形效果就还行,但立方体的效果就很差 。

这种基于菲涅尔的泛光对模型的要求很高,可以用基于高斯模糊的泛光,效果巨好,可以参考物体描边一章,效果图在这篇文章的末尾,都是基于高斯模糊。

(65条消息) UnityShader基础案例(五)——物体描边_implosion98的博客-CSDN博客_unity 描边

UnityShader基础案例(三)——外发光(泛光)和内发光相关推荐

  1. php判断学生姓名,PHP基础案例三:判断学生星座

    一.需求分析 星座是根据出生月日(11-14位)进行匹配:例如,当出生日期在3月21日和4月19日之间就为白羊座,其他星座按此继续编写. 二.设计思路 1. 星座的划分是两个日期的区间,当日期小于10 ...

  2. UnityShader基础案例(八)——全局雾效

    雾公式 (Direct3D 9) - Win32 apps | Microsoft Learn 这个参考一下吧. 一.基于高度 雾的高度什么的要看场景,根据场景调. 脚本: using System; ...

  3. php for 循环 try_PHP基础案例四:展示学生列表

    php中文网课程 每日17点准时技术干货分享 相关推荐: 1.<PHP基础案例一:展示学生资料卡> 2.<PHP基础案例二:计算学生年龄> 3.<PHP基础案例三:判断学 ...

  4. CSS基础「三」盒子模型/产品模块案例/圆角边框/盒子阴影/文字阴影

    本篇文章为 CSS 基础系列笔记第三篇,参考 黑马程序员pink老师前端入门教程 其他CSS基础相关文章: CSS基础「一」基础选择器 / 字体属性 / 文本属性 / 三种样式表 CSS基础「二」复合 ...

  5. 计算机文化基础案例教程第三版答案,计算机文化基础案例教程教学课件作者第3版谭宁教学课件素材排骨做法.doc...

    计算机文化基础案例教程教学课件作者第3版谭宁教学课件素材排骨做法.doc (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 1.香酥排 ...

  6. React 基础案例 | 可折叠的问题列表和按分类展示的美食菜谱(三)

    一.开篇 大家好,本篇文章小编将和大家一起做两个简单的案例--可折叠的问题列表和按分类展示的美食菜谱.这两个案例,我们还是继续练习 useState Hook 的用法. 在前面的两篇文章里我们已经练习 ...

  7. 2021年大数据Flink(三十六):​​​​​​​Table与SQL ​​​​​​案例三

    目录 案例三 需求 编码步骤 代码实现-方式1 代码实现-方式2 案例三 需求 使用Flink SQL来统计5秒内 每个用户的 订单总数.订单的最大金额.订单的最小金额 也就是每隔5秒统计最近5秒的每 ...

  8. 计算机应用基础案例教程总结,计算机应用基础案例教程

    包杰军等编著的<计算机应用基础案例教程>以培养职业能力为目标,本着"做学合一"."理论与实践并行"."知识与技能并重"的教育思想 ...

  9. 计算机应用基础案例实训教程,计算机应用基础案例式实训教程

    计算机应用基础案例式实训教程 语音 编辑 锁定 讨论 上传视频 <计算机应用基础案例式实训教程>是2014年3月出版的图书,作者是刘云芳.[1] 书    名 计算机应用基础案例式实训教程 ...

最新文章

  1. 使用HtmlHelper 写自己的 mvc 分页
  2. mysql2005错误_sql-server-2005 – SQL Server 2005错误701 – 内存不足
  3. C++阶段01笔记03【运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符)】
  4. C++之stdafx.h的用法说明
  5. [python机器学习及实践(2)]Sklearn实现朴素贝叶斯
  6. windows .bat脚本检测文件更新,并复制
  7. 用 :focus-within 实现纯 CSS 下拉框组件
  8. 阿里java工具包_阿里开源的Java诊断工具Arthas(阿尔萨斯)
  9. 为什么字符串中的字符无效_JavaScript中的基本字符串与字符串对象的区别
  10. 作为无人机方面做嵌入式编写的飞控总结5-磁力计对航向角yaw的校准2(磁力计如何校正航向)
  11. python selenium清除缓存,Selenium Python:无法清除chrome浏览器缓存
  12. 表数据查询结果的处理
  13. 个人税收计算器(只限长沙)全线仿照九米个税计算器
  14. 运用Python——劳拉下棋_四连环游戏_重力四子棋游戏(代码与游戏判定)
  15. AMR文件时长解析——附c代码
  16. 阿里云相关-云服务器ECS
  17. Excel 正则表达式的用法
  18. 原创---爱普生LQ-690K打印机win7共享报错解决方案“Windows无法连接到打印机。无法找...
  19. citus多CN部署
  20. Java学习的第一道垲

热门文章

  1. IE-LAB网络实验室:VPLS技术介绍
  2. Centos7 -- 用三种方法设置代理服务器上网
  3. HTML嵌套Flash播放视频
  4. Timus Online Judge 2045 Richness of words
  5. Smartbi:水泥行业实现数字化转型升级势在必行
  6. 两线怎么接三线插座图_三线插座怎么接两线
  7. 知行合一ArduPilot | ArduPilot控制器框架简述与PID参数整定
  8. 【APT】The following signatures were invalid
  9. 大道至简之四:透过现象看本质
  10. 大咖面对面 | 燕雀安知Suji之志