前面的话

unitychan是日本unity官方团队提供的一个Demo,里面有很好的卡通渲染效果,值得参考学习

上图是我整理出来的shader结构,可以看到Unity娘被拆分成了很多个小的部件,我想主要是为了挂动态骨骼吧。因为有很多部件的材质,shader其实都是一样的可以合并成少数几个

我打算分3个部分来学习

  1. CharaMain.cginc 主要用于衣服等材质
  2. CharaSkin.cginc 皮肤效果
  3. Hair 头发、眼睛、睫毛等部位的渲染

CharaMain.cginc

本篇先写第一部分body材质。CharaMain.cginc中包含漫反射、高光、反射、边缘光、阴影等效果的实现,接下来我们详细拆解

基础着色效果(模拟漫反射)

这里是用视角向量跟法线点积(但这样的做法就不会受光照角度变化),然后用结果采样一张类似这样的衰减纹理

    // Falloff. Convert the angle between the normal and the camera direction into a lookup for the gradientfloat_t normalDotEye = dot( normalVec, i.eyeDir.xyz );float_t falloffU = clamp( 1.0 - abs( normalDotEye ), 0.02, 0.98 );float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );float3_t shadowColor = diffSamplerColor.rgb * diffSamplerColor.rgb;float3_t combinedColor = lerp( diffSamplerColor.rgb, shadowColor, falloffSamplerColor.r );combinedColor *= ( 1.0 + falloffSamplerColor.rgb * falloffSamplerColor.a );


效果如下,边缘较白

但我感觉加上采样颜色后效果不是很明显,边缘颜色会深一些。

高光效果

    // Use the eye vector as the light vectorfloat4_t reflectionMaskColor = tex2D( _SpecularReflectionSampler, i.uv.xy );float_t specularDot = dot( normalVec, i.eyeDir.xyz );float4_t lighting = lit( normalDotEye, specularDot, _SpecularPower );float3_t specularColor = saturate( lighting.z ) * reflectionMaskColor.rgb * diffSamplerColor.rgb;combinedColor += specularColor;

这个高光的计算很奇葩,也是用法线跟视角向量的点积,最后的效果就是有一点淡淡的高光。也是跟真正的灯光角度无关的。

这里还用到了一张贴图,高光会用到这张图的rgb通道,后面要写的反射,会用到这张图的a通道。
大概就是描出来那些地方高光强一些

反射

// Reflection
float3_t reflectVector = reflect( -i.eyeDir.xyz, normalVec ).xzy;
float2_t sphereMapCoords = 0.5 * ( float2_t( 1.0, 1.0 ) + reflectVector.xy );
float3_t reflectColor = tex2D( _EnvMapSampler, sphereMapCoords ).rgb;
reflectColor = GetOverlayColor( reflectColor, combinedColor );combinedColor = lerp( combinedColor, reflectColor, reflectionMaskColor.a );
combinedColor *= _Color.rgb * _LightColor0.rgb;
float opacity = diffSamplerColor.a * _Color.a * _LightColor0.a;

这里是采样一张环境贴图,为啥用张这样的图呢?我觉得他主要是为了能反射出这种银色的色调罢了。你想要什么色调就换啥样的环境图。

GetOverlayColor这个函数是用来融合自身贴图颜色,跟反射环境贴图颜色的。里面用了很多小技巧

先来看看直接输出反射贴图是什么样

通过GetOverlayColor融合后的反射颜色

然后这里会用到高光反射贴图的A通道,来表示某些区域的反射的强度。

用alpha通道做差值后会发现,大部分区域的反射颜色都不见了,因为大部分是黑色。只有少数白色区域,能看到一些反射效果

接收阴影处理

这里是计算其他物体投射在身上的阴影,这里插入了一个自定义的阴影颜色,为了明显一点我直接调成纯黑,然后弄了一个物体挡住了unity酱~ 效果如图

使用LIGHT_ATTENUATION指令对阴影贴图采样并且返回数据供你使用。如果你想知道LIGHT_ATTENUATION指令具体做了些什么,检查 AutoLight.cginc文件

#ifdef ENABLE_CAST_SHADOWS// Cast shadowsshadowColor = _ShadowColor.rgb * combinedColor;float_t attenuation = saturate( 2.0 * LIGHT_ATTENUATION( i ) - 1.0 );combinedColor = lerp( shadowColor, combinedColor, attenuation );
#endif

边缘高光

终于这里有一个跟着光照角度变换的效果了,哈哈

一般我们会使用菲尼尔效应来实现边缘光,而unitychan里面则是采用了一张边缘光贴图

用N.L计算出来的值域在[-1,1]之间,*0.5+1后,转成[0,1]区间,然后对这张1维的rim图采样。

我们从右边打一盏平行灯,来看看采样的效果。跟光向量夹角越小的值越接近1,也就越白

但是边缘光效果要收到漫反射影响,所以他这里乘上了之前采样出来的漫反射渐变,可以看到高光被控制在了边缘

falloffU = saturate( rimlightDot * falloffU );

完整效果

总结

CharaMain.cginc中用了很多的小技巧实现了漫反射、高光、反射、边缘光。她没有传统卡通渲染赛璐璐的阴影渐变,也没有油腻的高光。她的效果都有种欲出还收的感觉。

我还是觉得效果太淡了一些

Unity酱~ 卡通渲染技术分析(一)相关推荐

  1. 【非真实渲染】【卡通渲染技术点介绍】

    阅读指南 文本介绍卡通渲染的基本技术,实现会放在另外的文档 关键词 Cel Shading,ToonShading,色块.色调,各向异性,描边,高光 特征 看起来像手绘的图片 少渐变(指光影的变换), ...

  2. Unity Shader 卡通渲染 模型描边之退化四边形

    目录 前言 一.基于空间的边缘检测算法 二.退化四边形 三.Unity中的CommandBuffer和ComputeBuffer 四.构成描边的简单实例 五.模型描边的实现 前言 之前写了一篇< ...

  3. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  4. Unity Shader卡通渲染 · 高清渲染管线·HDRP

    Unity Shader卡通渲染 · 高清渲染管线·HDRP 前言 最近在研究HDRP管线中的卡通渲染,就想着能不能把官方的UCTS移植到HDRP管线里面去,说干就干,到昨天晚上上传了github,今 ...

  5. Unity Shader 卡通渲染 (一):仿塞尔达荒野之息 Shader(简易版)

    温馨提示: 本系列文章面向那些 Shader 刚刚入门,想寻求进一步提升的群体,如果对 Shader 一无所知的话,建议自行搜索其他 Shader入门教程观看学习,再食用本系列文章. 前言: 说起卡通 ...

  6. Unity Shader 卡通渲染 (三):仿塞尔达荒野之息 Shader(顶点色控制细节)

    上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/100925621 顶点色在卡通渲染中有挺多应用,本篇会在上一篇的基础上,运用模型顶 ...

  7. unity shader卡通渲染(描边)+阴影+多光源处理

    说道卡通渲染,应该都会想到描边: 我所学的描边有三种: 一种是计算边缘深度检测描边 一种是色差检测描边 一种是利用顶点法线向外扩展返回单色pass,使用正面裁剪 我用的第三种: pass {//剔除前 ...

  8. [Unity Shader]卡通渲染

    最终效果,包含描边,明暗双色阶的渲染,边缘光. 参考来源:https://www.zhihu.com/column/c_1215952152252121088 卡通渲染 Back facing描边 光 ...

  9. Unity Shader 卡通渲染 (五):仿日式赛璐珞风格 Shader(顶点外扩描边)

    上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/101080649 一.赛璐璐风格简介 有些人可能会问,什么是赛璐珞风格? 赛璐珞是 ...

  10. unity 3d物体描边效果_从零开始的卡通渲染描边篇

    序言: 一直对卡通渲染非常感兴趣,前后翻找了不少的文档,做了一些工作.前段时间<从零开始>的手游上线了,试着渲染了一下的其中模型,觉得效果很不错.打算写一个专栏记录其中的渲染技术.在后面的 ...

最新文章

  1. GANimation填坑之旅
  2. 当年轻人开始谈论AI伦理
  3. 虚拟主播上线:多模态将改变人机交互的未来
  4. 两个不同的文件相互引用全局变量
  5. java进程内存一直没释放_面试官:一个线程OOM,进程里其他线程还能运行么?...
  6. 在 Mac 上为 Android 编译 WebRTC
  7. 使用正确的垃圾收集器将Java内存使用量降至最低
  8. 大量html乱码seo,HTTPS改造之后网页错位乱码,影响SEO和正常访问,应该这样改
  9. linux gdb 脚本,如何写gdb命令脚本
  10. JAVA链表中迭代器的实现
  11. 本来连学计算机的都不是,怎么却读了计算机研究生
  12. 华为nova7保密柜_华为nova8系列发布 Vlog视频旗舰3299元起
  13. 网络工程师考试试题及答案+SUV
  14. java 恒等于_JavaScript中 ==(等于) 与 === (恒等于) 的区别
  15. Script.NET 1.0版本的Tcl+Html界面编程原理
  16. 布尔逻辑析取范式思考
  17. 传真百科:电子邮件能取代传真吗
  18. 2018中国大学生程序设计竞赛 - 网络选拔赛
  19. 小柴胡灵活加减治杂病
  20. pip install warning

热门文章

  1. Android 10 后台启动app页面
  2. 微信声音锁会上传到服务器吗,微信声音锁安全吗?微信声音锁可以换吗?
  3. python绘制等高线图
  4. js调用html打印去掉页眉页脚,js 客户端打印html 并且去掉页眉、页脚的实例
  5. 【Pigeon源码阅读】高可用之熔断降级实现原理(十四)
  6. 编写函数:字符串的小写转大写(Append Code)
  7. deebot扫地机器人说明书_ecovacs扫地机器人730使用说明书_deebot扫地机器说明书
  8. hibernatexml方式和注解方式实现单实体映射和继承关系映射,eclipse实现
  9. Java:Logstash如何安装插件logstash-output-jdbc
  10. Java制作简易计算器