Unity-ShaderLab 逆向还原《原神》角色卡通渲染思路与实现(保姆级教学)-2_逆向 提取 unity shader-程序员宅基地

技术标签: 图形学  shader  3d渲染  UnityShader  游戏  unity3d  

一转眼已经有一个多月没更新了额,时间过得真快。今天终于决定要更新Part 2了。
----那我们就继续吧。
上篇已经讲完了漫反射、高光和光照贴图,本篇将会介绍角色背光时边缘光与基于阈值图的面部阴影的实现方法。

3.4基于Fresnel原理实现背光边缘光

我们知道,将光照方向与物体表面法线方向点乘,可以获得光照方向越接近表面法线方向,计算值越大的结果。我们可以使用这个结果来配合smoothstep等函数来区分物体的亮暗面。

----那么请想象一下,如果我们将视线方向与物体表面法线方向点乘,可以获得什么结果呢?
是不是相当于:我们的视线就是光源,直视哪个片元,哪个片元的点乘结果就越大。
(我们说的视线方向,指的都是指向眼睛的向量方向。)

现在我们将这个计算的结果先使用Saturate函数控制在0-1之间。然后用1减去这个值,将它反过来。
我们就可以得到如下结果:视线越垂直于片元表面,那里的值就越接近0;视线与片元表面的法线方向越偏离,甚至相反,那里的值就越接近1。

将这个结果直接输出,我们来看一下是什么效果。
在这里插入图片描述
可以看到,角色的边缘光效果已经有了“雏形”。
以上效果使用的原理便是著名的“Fresnel菲涅尔”。

但是目前来看,这个效果还是有些过于“浑浊”。为了更加接近“卡通绘画”的效果,我们需要让边缘光更加生硬,过度不要过于柔和。
使用的手段十分简单,和之前进行二值化的操作一模一样:使用smoothstep。
我们将以上计算的结果作为smoothstep的第三个参数,然后声明两个暴露在外的float类型参数作为smoothstep的前两个控制参数,将黑白区域进行平滑二值化。
以下是经过smoothstep以及调参之后的输出结果:
在这里插入图片描述
OK,这就是我们想要的效果。

下面要对这个效果进行一个简单的处理,让角色只有在背光时,才会出现边缘光效果。

这个处理的手段十分简单,我们直接创建一个向量,让它指向角色身后,然后让光源方向点乘它。这样就可以获得:光源越直射角色身后,点乘结果越大的效果。
要创建这个背身向量,我使用了UnityObjectToWorldDir函数,它可以接受一个模型空间的向量,将它转换到世界空间下,因为我的光源方向是在世界空间下计算的。我们在进行向量运算时,一定要确保它们在同一个空间。

float3 Front = normalize(UnityObjectToWorldDir(float3(0, 1, 0)));
//获得世界空间下的角色面朝方向的向量,(0,1,0)是角色模型空间的面朝方向的方向向量。"-Front"就是背身向量

接下来,我们将这个值使用Saturate函数限制到0-1之间,然后直接乘以之前计算的边缘光的值。
这样一来,当光源方向不从角色身后照射时,就不会有任何边缘光效果了。并且,当光源从角色侧面慢慢转向角色身后时,边缘光会越来越亮,这个效果非常好。

但是,以上操作会让边缘光的过度重新变得有些“浑浊”&

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42951204/article/details/113996133

智能推荐

开始使用Keepass 管理密码-程序员宅基地

文章浏览阅读149次。其实很早以前就用过KeePass Password Safe ,不过没有贯彻下去 后来管理密码的方式有下面四种: 一是不管,后果是惨痛的,也浪费了更多的时间 用一个txt 文件,不过密码是用助记码写的,防止别人 还有是发一封邮件到gmail 中,gmail中搜索功能不错 最常用的是LastPass,很不错,不过害怕突然有一天这一点云服务不能用...

CTF——Thinkphp5远程命令执行漏洞利用_thinkphp5ctf-程序员宅基地

文章浏览阅读7k次,点赞12次,收藏35次。[BJDCTF 2nd]old-hack(5.0.23)进入之后:打开页面,页面提示powered by Thinkphp。说明可能和thinkphp框架有关。也确实如此,这里用到了thinkphp5的远程命令执行漏洞。Thinkphp5远程命令执行漏洞漏洞描述:由于thinkphp对框架中的核心Requests类的method方法提供了表单请求伪造,该功能利用 $_POST['_meth..._thinkphp5ctf

Oracle不建议使用varchar2来存时间数据,实际案例说明_oracle 用字符串存储时间 坑-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏4次。问题现象2015年9月客户系统中一条高逻辑读的SQL语句,在业务高峰期执行频率较高,导致系统逻辑读居高不下,同时带高了系统CPU,SQL语句主体部分如下SELECT /* ^^*/COUNT(DISTINCT ts_map.draftid) AS recordCountFROM usr.BillStateMap ts_mapINNER JOIN usr.create ts_creat..._oracle 用字符串存储时间 坑

用NPOI操作EXCEL--生成下拉列表_npoi下拉选项-程序员宅基地

文章浏览阅读4.7k次。用NPOI操作EXCEL--生成下拉列表 设置步骤为:(1)选定一个要生成下拉列表的区域;(2)设置数据有效性为序列,并在来源中填充可选下拉的值,用“,”隔开(如图)。对应的效果为:同样,利用NPOI代码也可以实现上面的效果:HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");_npoi下拉选项

基于SSM框架开发汽车租赁系统开发与设计(附论文源码资料)_基于ssm的网上租车系统的设计与实现-程序员宅基地

文章浏览阅读643次,点赞3次,收藏8次。汽车租赁系统的开发过程中,采用B/S架构,主要使用Java主流技术进行开发,结合最新流行的SSM框架。使用Mysql数据库和Eclipse或者IDEA开发环境。包括登录、首页、客户管理、车辆管理、汽车出租、出租单管理、汽车入库、检查单管理、系统管理等功能,适合二次开发课程设计、毕业设计等。_基于ssm的网上租车系统的设计与实现

Ubuntu16.04+ros+orbslam2_relsense orbslam2-程序员宅基地

文章浏览阅读254次。intel realsens D435相机的开发系统 Ubuntu16.04 ,ROS相机 Intel realsense d435算法 ORBSLAM21.安装基于ROS使用的realsense的包(这里面包含realsense SDK和ROS kinetic)2.编译ORB-SLAM2(build.sh和build_ros.sh)3.获取相机信息,实现数据传输并进行深度图像配准。一:安装RealSense SDK2.01.下载源码:$ git clone https:_relsense orbslam2

随便推点

Ubuntu18.04下安装uhd+gnuradio-程序员宅基地

文章浏览阅读626次。入坑gnuradio和uhd的安装和环境配置很久了,总结一下遇到的问题thinkpad笔记本安装ubuntu16.04有问题,安装完就黑屏,试了很久各种方式都安装不上最后用了ubuntu18.04.Dell台式机(忘了是啥配置),两个版本都能安装。一共有三种方法配置环境1、二进制码安装(方便,快速,无需配置环境,但是版本比较老)2、源码安装(容易出现各种问题)3、pybombs安装(大家都说好,但是我用着也不太方便)以上均需先安装uhd,后安装gnuradio1、二进制码安装安装uhd参

数据结构中的中缀表达式转化成后缀表达式_已知操作符包括+,-,*,/,(和).将中缀表达式-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏8次。接上一篇博客。已知操作符包括:+ , / , * , / , ( , ) ;形如中缀表达式:a+b-a*((c+d)/e-f)+g 步骤 扫描项 项类型 动作 栈内内容 输出 0 ..._已知操作符包括+,-,*,/,(和).将中缀表达式

校招面试知识点复习之计算机网络_tdma,fdma,cdma属于物理层还是数据链路层-程序员宅基地

文章浏览阅读9.7k次,点赞15次,收藏80次。1、电路交换与分组交换电路交换特点:资源会被预留 电路交换分为:频分多路复用以及时分多路复用优点:可以为一个通话保证特定数量的端到端带宽缺点:效率低分组交换特点:资源不会被预留优点:效率高今天的因特网就是分组交换的典范!分组交换中的时延处理时延、排队时延、传输时延、传播时延、传输时延这其中要特别注意传输时延与传播时延的区别!!!传输时延:R= 链路带宽 (bps) L= 分组长度 (比_tdma,fdma,cdma属于物理层还是数据链路层

解决“ValueError: Unknown resampling filter (107). Use Image.NEAREST (0), Image.LANCZOS (1), Image.BIL”_valueerror: unknown resampling filter (720). use i-程序员宅基地

文章浏览阅读1.2w次,点赞32次,收藏13次。1. 问题描述利用Pillow进行图像resize操作,结果报错:File "C:\Users\yafux\Anaconda3\envs\cu80_py36_tf140\lib\site-packages\PIL\Image.py", line 1869, in resize message + " Use " + ", ".join(filters[:-1]) + " or " +..._valueerror: unknown resampling filter (720). use image.nearest (0), image.la

AS400相关资料整理(初学者)_as400oase@swkw。??-程序员宅基地

文章浏览阅读612次。AS400资料整理1.如果你的权限足够的话,可以使用CRTLIB命令给自己建个库,如:CRTLIB LIB(MYLIB) TYPE(*TEST) TEXT(‘for test’)库建好之后,你可以使用STRPDM->2,在Library处输入库名MYLIB,按确认键就进入该库。这时库下面没任何文件,你可以使用CRTSRCPF命令建立一个源物理文件,用来放置源码,如:CRTSRCPF FILE(MYLIB/MYSRCPF) IGCDTA(*YES) TEXT(‘源物理文件’)【注:】参数IG_as400oase@swkw。??

类名直接调用与对象引用的区别_调用类可以没有引用吗-程序员宅基地

文章浏览阅读3k次。在工厂类里面工厂方法为什么是静态的,要靠类名来调用?如:public class Factory{public static getInstance(){ return XXX();}}客户端调用:Factory.getInstance();而public class Factory{public XXX getInstance(){ return XXX();}}客户_调用类可以没有引用吗

推荐文章

热门文章

相关标签