一、卡通渲染
(1)基础表现——光照:
-
对Diffuse进行修改
有两种方式:
Step/Smoothstep函数
RampMap
Lambert采样Ramp图
-
边缘光RimLight
两种方式:
Fresnel
金属的边缘光可以由NdotV获得
DepthOffset
可以获得等宽的硬边缘,对转折比较少的模型,比如正方体比较好一点。不过原神的人物边缘光有一个trick,只在屏幕左右法线方向进行深度偏移(减少头顶的边缘光),场景则是全向,法线方向。
-
明暗交界线(SSS夸张)
确定明暗交界线的范围就行,ramp图或者用函数计算
(2)基础表现——描边
分割结构,补充轮廓信息,因此早期也叫轮廓边。
动画的场景中大多以亮线的高光形态来表示,人物则一般用深色:
现在的描边一般是风格化的特征了,比如无主之地。
常见的描边方式:
-
RimLight: 基于观察角度和表面法线、基于深度的。
-
Backface:过程式几何轮廓线渲染
-
边缘检测:图像后处理轮廓线渲染
-
基于轮廓边检测
-
本村线uv
-
Backface
通常存一份平滑法线到切线数据中
-
边缘检测
不同场景下的消耗统一。
对卡通渲染来说,一般需要整洁的边缘线,这种方法会出现多余的边缘信息,常见的技巧是在边缘检测区域进行不同的纯色填充,这样可以得到干净的结果。
-
基于模型拓扑轮廓边检测
离线渲染,消耗高,可以获得很风格化的表现
-
本村线
制作周期长,一般不考虑
(3)基于PBR的卡通表现
PBR基于物理的渲染,对现实的还原。NPR/卡通渲染非真实感的渲染,名称上对立,但是为了效果的提升可以各取相关的特征进行缝合。
使用PBR的优势;
艺术导向,能让美术用直观的参数,标准化的工作流,快速实现大量材质的真实感渲染。把NPR的特征迁移到PBR中并保留这种易用性是其目标。
标准化工作流
高级质感
真实环境光照
-
材质质感
-
环境光照
间接光照计算可以方便地适配不同环境中的表现。
-
典型PBR光照材质示例:
4.将卡通渲染特征插入PBR材质示例:
实际项目中肯定不会用shadergraph来搞这个。
数据初始化的处理:
主要是对N法线进行了操作,NdotL和相关阴影计算都可以在这里进行重新映射和合并,比如:二值化光照,面部阴影、头发投影、阴影贴图等相关操作合入到NdotL的结果之中。同时NdotV也可改变一部分菲涅尔的效果。
DFG项目:
主要更改D项目,比如对GGX高光的范围进行重新映射,或者计算各项异性高光,并加入遮罩偏移之类的。
Direct Diffuse计算:
这部分进行的操作基本上可以当做自发光emission来添加,对于卡通渲染来说一些色彩混合操作在这里加入。比如头发高光要以颜色方式加入到计算结果中,就像柔光、线性光这种操作。
Indirect Diffuse + Specular:
间接光会显著提升模型的质感和立体感,对卡通渲染来说立体感提升不一定是好事,所以这里对不同的部分减少间接光的权重,比如说皮肤、面部这些需要平面表现的部分去减少间接光的比例。其他做法比如蓝色协议使用整体向上的法线来计算统一的间接光。
Other Eye Matcap Rim:
这部分计算是直接当做自发光来添加的。比如:眼睛的高光、matcap反射、边缘光等。
经过魔改PBR之后的表现:
和默认PBR对比起来:
因为自定义了阴影颜色和一些自发光的原因,所以整体看起来会更加明亮一点。
(4)为不同区域定制shading model
分成头发、眼睛、皮肤这些区域:
题外话,3D还原2D的难点:
-
高度概括的边界:对传统的卡通角色来说简洁且高度二分的交界边缘是灵魂,但3D中平滑且锐利的边界是很难还原的。
-
不同视角的造型:不同的视角下卡通夸张与形变。
-
违背物理的特征:一直存在的高光,恒暗的阴影。
-
高饱和度倾向:色彩高饱和度,纯净。但不同设备之间有HDR与LDR的转换,都会使用到ToneMapping,这就会导致卡通渲染的色彩问题。
接下来介绍不同部位的shading model:
-
面部
光影修正:
修正的原因在于二值化导致阴影的边缘杂乱。
修正的方法有法线、拓扑、SDF
包裹体法线
模型拓扑 + 法线修改
罪恶装备方式,可以调整出理想的形状,但是法线的调整比较繁琐、耗时。还会导致阴影的跳变。
有向距离场SDF
这种方式可以方便的定义阴影的过度,不过为了边缘阴影信息的准确,这张图需要的精度是比较高的。并且缺少光照Y轴的变化,只有单向的光照信息,用多张SDF混合可以解决这个问题,但是这样制作就比较繁琐了。
其他
暗部的鼻尖高光,一般是为了暗部面部不至于过平才加上的。可以使用一张Mask(SDF)补光
-
头发
头发的重要表现就是阴影和高光了。
阴影比较简单,一般来说就是绘制影贴图加光照计算来表达。
主要来说高光:
各项异性
下图左边GGX,右边是各向异性的:
KK模型
最核心的计算就是将BlinnPhong中NdotH中的法线N改为了切线T,将切线加入到光照的计算中,从而得到各向异性的环状高光。注意图中的切线方向是沿着发丝方向的,一般制作时通常是垂直发丝的,所以通常是使用副切线来计算的。
Marschner模型
左边kk,中间M,右边真实,可以看出这个模型更加物理。这不细讲了。
但要注意这里将光路分成了三条光路:反射、透射反射透射、透射透射。
它们贡献了头发高光的主要特征,分别是主要镜面反射高光、次要镜面反射高、透光。
前两个特征就是卡通渲染中叠加计算头发高光的来源。
上述计算的结果
这里提亮了第一层的高光强度。kk中有一个smoothstep函数,可以控制成单向的渐变过度,就能变成左图的样子
切线修正
整洁的效果要修正切线,各向异性的计算依赖于顶点切线,在头发上渲染出连续的各向异性高光需要连续的切线信息。
修正的方式有两种:打直UV、绘制FlowMap来指定切线方向。
另外,如果头发是一个球体的形状也可以虚拟一个球心,然后通过计算来确定切线方向。
另外基于UV的绘制高光
直接贴到模型上,但是没有动态反馈会比较死板,要加入相对应的动态变化。比如蓝色协议中会先画高光,通过预先烘焙的贴图计算高光的中心,最后根据视角去缩放高光的大小。樱花大战游戏中,把UV排列整齐,高光贴上去,通过高光的上下移动来表现动态变化。
总之,头发高光主要为两点:好看的形状、动态的反馈。
-
眼睛
卡通中的眼睛比较随心所欲,但大体上还是遵循着真实眼睛的折射和焦散体现。
眼睛的结构
制作终点在瞳孔和虹膜,和主体的眼白区域。前方的空腔要注意有透射折射
为了表现透射和折射,制作上可以有两种结构:
主体内陷的复合结构
可以自然地将眼睛的结构关系表达清楚。高光可以分成左边的点状高光模型或者右边的片状高光的模型
外轮廓的单层结构
就是凸出来的,单层的轮廓模型+视差计算:
眼睛的表面还可以制作动态的高光反馈:
折射计算
可以用视差或者物理折射两种方式:
都是对uv偏移采样,视差根据相机的位置去偏移UV,基于物理的是计算折射光线向量,用折射光线去偏移UV。
眉眼遮挡
-
皮肤
主要和前面说的光照计算有关,明暗交界线的计算也是皮肤的特征之一。这里主要说一下SSS。
对于皮肤来说次表面散射和高光会显著提升皮肤的质感。
次表面散射:
主要分为两类:鹿鸣、闪耀暖暖这种偏写实的。另一种就是蓝色协议、罪恶装备这种卡通风格,会做整体阴影颜色的改变。
整体阴影颜色的改变:
动画中阴影偏色来源一般是皮肤的SSS和环境结合的夸张表现。罪恶装备中使用了一张纹理来影响阴影的着色景象。对整体阴影颜色的处理会提升卡通化的观感,并且不仅限于皮肤上,衣服上头发上也有体现。
另外如果用ramp计算光照,可以直接把影色添加到ramp中。
SSS:
LUT的y轴是模型表面的曲率决定的。曲率越大效果越强。
fwidth(v)=abs(ddx(v))+abs(ddy(v))
高光:
高光不可或缺。
双镜叶高光:将不同粗糙度下GGX进行混合,用于模拟真实皮肤表面的反射效果。
将前面说的这两个表现结合起来就是类似于18年崩三分享的做法:diffuse ramp对应SSS,specular ramp对应镜面高光。
二、其他游戏角色渲染
(1)原神
-
lightmap
-
Matcap
view空间采样,加张图模拟高光反射表现,阴影处也有。
-
PackedShdowRamp
-
此外还有顶点色r控制Ramp偏移值,用于控制在特定光照角度下那些区域更容易受光。
(2)深空之眼
同样对金属做了特殊处理
概要设计
按照渲染表现材质分类:
金属
布料
皮革
皮肤
头发
眼睛
面部
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...