身体渲染

  • 高光
  • Dither效果
  • Rim
  • 特殊状态
  • 小结

高光

前面介绍了暗面的计算方式,接下来是高光的计算效果。高光计算比较简单,采用了Blinn-Phong的光照模型,明暗计算的时候采用了lambert的光照模型。
问题来了,高光是否可以控制呢?崩坏采用了两张遮罩图处理高光,一张是高光的遮罩图,一张是高光系数,分别存储在B,R通道。
B通道图如下:

通道值从1到0,受高光影响越来越小,为0时则完全不受高光影响。
R通道图如下:

什么??我绝对不是复制粘贴的,确实和B通道有点像,但是两个通道的意义却有本质的区别,一个是阀值,一个是系数。

//---高光区域计算
fixed3 worldViewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
fixed3 worldHalfVec = normalize(worldViewDir + _WorldSpaceLightPos0.xyz);
fixed3 worldNormal = normalize(i.worldNormal);
//高光计算--
fixed spec = pow(saturate(dot(worldNormal, worldHalfVec)), _Shininess);
//计算高光遮罩--根据光照的数据进行高光计算。贴图中为1表示高光区域
spec = step(1.0f - lightTexColor.b, spec);
//lightTexColor.r定义了高光的系数。
fixed3 specularColor = _LightSpecColor * _SpecMulti *lightTexColor.r  * spec;
float3 shadowEndColor = specularColor + diffuseColor;

代码很简单,主要是对于两张遮罩图的处理方式。实现的效果就是美术可以自己控制高光区域,并且控制高光的系数。
至此明暗和高光都已经完成处理。

擦。。居然不能上传短视频,那就看图吧,我们看下这有明暗和高光的处理。图中1,2,3,4均为高光部分,我们可以看到通过控制_Shininess我们可以控制高光形状,如果不了解pow函数制造的是怎么样函数曲线,可以观看我的另一篇文章 .,我们可以看到1,2处的高光强度的对比是通过哪里控制的?答不上来从头看吧~~~通过高光遮罩我们实现比较丰富的动态变化,比如右腿膝盖外侧的色彩部分,等等。。动起来效果会比较好~

Dither效果

崩坏的Dither效果实现起来还是比较好理解的。效果如图:

代码处理也很简单,由于之前没玩过崩坏(。。。。确实没玩过,我的舰长就是到了获得芽衣),后来玩发现游戏里的Dither效果。。

float4x4 _RowAccess = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
float2 pos = (i.screenPos.xy/ i.screenPos.w)*_ScreenParams.xy;
clip(0.9 - _RowAccess[floor(fmod(pos.x, 4))][floor(fmod(pos.y, 4))]);

主要是剔除,_RowAccess这个矩阵是外部传递的,我们稍微改变下矩阵就实现不一样的效果,比如这种:

有点恶心啊····密集恐惧症,改的时候居然没发现。。。当然还有很多种实现Dither的效果,只不过这种计算相对简单。。

Rim

边缘光也是卡通渲染的一大主题因素,也是很简单的计算,菲涅尔效应处理即可:

float colorRadio= _RGScale*pow(clamp((1.0 - dot(worldViewDir, worldNormal)), 0.0, 1.0), _RGShininess) + _RGBias;
float Fresnel= clamp(colorRadio, 0.0, 1.0);
col.xyz = lerp(shadowEndColor, colorRadio * _RGColor, Fresnel * _RGRatio);


可以看到有了边缘光的效果,这里我想说两点:1.这个边缘光并没有对明暗做单独处理,亮不部的边缘会有强烈的光源,暗部边缘的光源较弱或者为没有。2.身体使用边缘光后,大家注意看胸部的位置(。。。),相比之前的是不是变大了。。。因为计算的是法线和视角点积,所以在胸部这种地方就会有层次感了,看着很好,但是二次元表现所需要的。综合以上两点,我发现正常情况下,缇娅娜是没有整个效果的,所以他的边缘光应该是作为某种状态的时候出现的。
参数分析:

名称 含义
_RGShininess 控制边缘光范围
_RGScale 边缘光范围系数
_RGBias 边缘光偏移
_RGColor 边缘光颜色
_RGRatio 边缘光和默认色的比例系数

特殊状态

这里的参数比较多,我们提前看下:

特殊状态主要有特殊状态问题,特殊状态CubeMap,以及噪声图组成,然后有一个过渡控制系数。其中Bloom暂时忽略,之后会有。
首先是贴图的采样,注意这里的噪声图的UV坐标,使用的是物体的局部坐标,另外这个CubeMap的采样,是这样的(不知道是不是我理解的有问题。。)

float3 cubeMapView = normalize(worldViewDir - _WorldSpaceCameraPos.xyz);
cubeMapView = cubeMapView + spNoiseBaseColor.xyz*_SPCubeMapNoiseIntensity + _SPCubeMapOffset.xyz;
//计算反射
float3 cubeNormal= reflect(cubeMapView, i.worldNormal);
//采样CubeMap
float3 cubeMapColor = texCUBE(_SPCubeMap, cubeNormal).xyz;

然后就是cubemap和噪声图和过渡的控制,这里用到的算法还是很有意思的,这里就不做详细的解说了,直接上代码,具体的解释可以 参考这篇.

float transitonRadio = _SPNoiseScaler * _SPTransition;
//------_SPNoiseScaler*(_SPTransition*1.7-1.99*spNoiseBaseColor.x)+1
float transitonColorRadio = transitonRadio * 1.7000000 +1- spNoiseBaseColor.x *1.99*_SPNoiseScaler;
//return step(_SPNoiseScaler,spNoiseBaseColor.x) ;
//---这个*10表示只留下了之前0-0.1的部分作为过渡了
transitonColorRadio = clamp(transitonColorRadio*10,0.0, 1.0);
//---特殊颜色和过度色的差值计算--这个差值计算解析一下
//---因为噪声系数是不固定的为0-1,所以对于transitonRadio的有效值范围为[0-0.1],
//-----此时spNoiseBaseColor.x为0的地方为spcolor
float3 lerpTemp = lerp(spColor.xyz, _SPTransitionColor.xyz * _SPTransitionEmissionScaler, transitonColorRadio);
float2 tempTransitonRadio = transitonRadio * float2(1.7, 1.5) - 1.99*spNoiseBaseColor.x*_SPNoiseScaler+1;
//--非0即1,和噪声图的a通道做的比较
tempTransitonRadio = max(0, step(0, tempTransitonRadio));
//float3 spMixColor  = (transitonColorRadio != 0) ? spColor.xyz : lerpTemp;
float3 spMixColor = (tempTransitonRadio.y != 0) ? spColor.xyz : lerpTemp;
float lerpBloom = lerp(_SPTransitionBloomFactor, _BloomFactor, transitonColorRadio);
//--计算颜色--tempTransitonRadio.x与第一次计算的系数相同,为1.7,而这里做的限定为x!=0
spMixColor = (tempTransitonRadio.x != 0) ? spMixColor : spColor.xyz; //spColor.xyz
//--与二分色计算出的阴影效果做叠加
spMixColor.xyz= lerp(shadowEndColor, spMixColor, _SPIntensity*tempTransitonRadio.x);

效果如图:

(图中是去除了rim的效果),特殊状态还有个扭曲的效果,等着下次吧,还没看完。

小结

联系上之前几次讲的,第一个shader我们解析的已经接近尾声了(除了LUT部分,这个不打算进行),还差一个Bloom的效果,这个需要做后期,所以也会排的比较靠后。后期计划:接下来还有脸,头发,部分特殊效果,matcap的应用。最近看了下关于卡炫和PBR组合的方式,如下效果:

问了身边程序的同事说效果很好,美术几乎不怎么喜欢觉得有点奇怪。但是程序就是群众啊,群众喜欢的就是大众的。所以之后还是想研究下卡通渲染中加入PBR,毕竟现在的游戏没有点PBR都不好意思说效果好(也不知道为什么。。)。另外这个CSDN还是很友好的嘛~~还给我整了几个机器人关注,不会吧不会吧,他不会真的以为我信了吧。 生而为人,我很抱歉-------网易云

UnityShader崩坏渲染解析系列(3)--高光、Dither效果、Rim、特殊状态相关推荐

  1. UnityShader崩坏渲染解析系列(2)--明暗计算

    身体渲染 什么是明暗 处理明暗 崩坏处理 资源解析 总结 什么是明暗 与实时渲染不一样的地方在于,日式卡通渲染阴影过度有明显的分界线. 没错,左边的明暗变化有一条很明显的交界线,而右边的是有过渡效果的 ...

  2. Redux 源码解析系列(一) -- Redux的实现思想

    文章来源: IMweb前端社区 黄qiong(imweb.io) IMweb团队正在招聘啦,简历发至jayccchen@tencent.com Redux 其实是用来帮我们管理状态的一个框架,它暴露给 ...

  3. 2.0 解析系列 | 一文详解新一代OceanBase云平台

    小蚂蚁说: 9月21日,OceanBase 2.0 在云栖大会上重磅发布.我们将在接下来的时间里为大家持续推出 "OceanBase 2.0 技术解析系列" 文章,分别从 可运维性 ...

  4. Fragment全解析系列

    文/YoKey(简书作者) 原文链接:http://www.jianshu.com/p/d9143a92ad94 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". F ...

  5. 【数据结构与算法】4.数据结构图文解析系列

    数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结 ...

  6. 技术解析系列 | PouchContainer 支持 LXCFS 实现高可靠容器隔离

    划重点 本周起 PouchContainer 启动核心技术专家解析系列文章,第一篇文章将深入剖析 LXCFS 适用业务场景和原理,对 LXCFS 感兴趣的同学不要错过 引言 PouchContaine ...

  7. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  8. Tomcat源码解析系列二:Tomcat总体架构

    Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载serv ...

  9. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)

    本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...

最新文章

  1. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
  2. 一边动,一边画,自己就变二次元!华人小哥参与的黑科技:实时交互式视频风格化...
  3. Django项目中的子项目中自动生成自己想要的文件内容
  4. WinJS实用开发技巧(3):仿微博信息流JK快捷键滚动
  5. python扫描内网banner信息
  6. 3COM小型企业有线局域网方案(三、四、五)
  7. python json dumps utf8_Python2操作JSON出现乱码的解决方案
  8. LeetCode 1003. 检查替换后的词是否有效(栈)
  9. 香港中文大计算机科学系电话,港大和港中文计算机科学系2021年提前批招生开启!...
  10. python条形码_python3转换code128条形码
  11. linux aria2磁力链接,Linux一键安装Aria2+Yaaw+FileManager实现BT磁力下载,并在线查看/观看...
  12. 编译原理(陈火旺)-中国大学慕课05 语法分析——自下而上分析5 第2次单元测试
  13. 前端JS时间验证,结束时间不早于开始时间
  14. 计算机网络(七)——互联网上的音频/视频服务 和 无线网络与移动网络
  15. 业务数据分析-大体逻辑
  16. 一条命令修复机械硬盘,提示需要格式化
  17. python 路由_静态路由配置
  18. windows安装linux
  19. RocksDB 概述
  20. window10安装深度linux双系统,转:【史上最详细】win10下的Deepin双系统安装小白教程-论坛-深度科技...

热门文章

  1. 如何建立高质量团队-《克服团队协作的五种障碍》笔记与心得
  2. 根据出生日期计算年龄(精确到天)
  3. URL地址中的中文乱码问题的解决
  4. 让你的Android应用支持转移到SD卡
  5. DBA到底要做什么?
  6. 写一个Singleton模式的例子
  7. 《乘风破浪的姐姐》来啦!让我们用数据分析谁能最终成团
  8. android资源库
  9. aistudio使用py检测深度学习是否训练完成并发送短信提示
  10. 中小商业银行主动安全纵深防御体系解决方案