14 KiB
title, date, excerpt, tags, rating
title | date | excerpt | tags | rating |
---|---|---|---|---|
YusufUmar_kama分析 | 2022-08-15 13:31:52 | 卡通渲染 | ⭐⭐ |
- Skin
- Hair
- Cloth
- Glod
- Lotus
- LotusLeaf
- Water Surface
皮肤
根节点使用了Principed BSDF,GGX,RandomWalk(Fixed Radius)。Subsurface值为0.01(开启了SSS效果),其他为默认参数。
使用Ucupaint Skin连接Pin:
- Color
- Roughness
- Normal
要点:
- 基底:皮肤颜色float3(0.846873,0.602632,0.512498)、Roughness 0.3、Metallic 0 。Subsurface:0.01
- 皮肤哑光效果使用Noise贴图并且使用ddx/ddy实现。
- #yP Layer Fake Lighting(全身)效果,模拟出皮肤的SSS以及环境光照效果,增强厚涂皮肤的质感。
- #yP Layer Red Skin (肩部区域与手指)效果,模拟皮肤的SSS效果,增强厚涂皮肤的质感。
- #yP Layer Skin AO (皮肤上的AO效果),模拟皮肤上的AO,
贴图
项目使用了4K贴图,并且将4x4个贴图会在一起,并且通过平移UV与使用不同UV通道方式来切换。
~Ucupaint Skin Image Atlas
Face UV(0.25,0.75)贴图作为Alpha来赋予脸部Roughness(内部Overrider 0.5)。~Ucupaint Skin Image Atlas
Face UV(0 00.5)腮红Mask~Ucupaint Skin Image Atlas
Face UV(0.75,0.75)腮红斜杠Mask~Ucupaint Skin Image Atlas
Face UV(0.25,0.75)嘴唇红Mask~Ucupaint Skin Image Atlas2
UVMap UV(0.25,0)贴图作为Alpha来赋予身体Roughness(内部Overrider 0.6,Alpha * 0.75)。~Ucupaint Skin Image Atlas2
UVMap UV(0.25,0.25)贴图作为Alpha来调整身体水渍Roughness(内部Overrider 0,Alpha)。~Ucupaint Skin Image Atlas
UVMap UV (0,0.75) 是脸上的水渍贴图,用作脸部水渍高度、透明度、Roughness,最后计算出Color、Roughness、Normal。(内部BaseColor Overrider:0 Roughness Overrider:0.1,Alpha)。
Group
~yPL Check Input Normal
- StartNormalFilter:因为最外部的Normal输入是float3(999,999,999)。所以输出的是float3(0.5,0.5,1.0)。
float3 StartNormalFilter(float3 InNormal)
{
float Ratio=InNormal.z > 250 ? 1 : 0;
return lerp(InNormal,float3(0.5,0.5,1.0),Ratio);
}
~yPL Tangent Process_Copy
通过UV来控制切线法线与次级法线。该节点需要对应的UV通道,Body模型里除了UVMap,有Face、Pupil、~TL Temp Paint UV。
- Face Tangent Process:2个参数输入都是1。
- Pupil Tangent Process:2个参数输入都是1。
- UVMap Tangent Process:2个参数输入都是1。
~yP Lyaer Noise
经过测试,好像没有区别
- 使用Neighbor UV(将UVMap的Tangent、Bitangent转换到Face的切线空间)来获得东西南北4个偏移方向。传入Layer Noise Source,得到Source、东西南北5个Noise随机Height值。
- 将Noise随机高度值从(0,1)->(-1,1),之后与PrevHeight融合(这里不融合)
- Height=Height/MaxHeight,之后将Height从(-1,1)->(0,1)
- 使用ddx/ddy的方式计算出Face切线空间的Noise Bump Normal,再使用Tangent与Bitangent计算出世界法线。
~yPL Neighbor UV (Other UV)
使用~yPL World2Tangent
计算 2个新向量:
- FaceTangent->(UVMapTangent,UVMapBitangent)=x
- FaceBitangent->(UVMapTangent,UVMapBitangent)=y
之后乘以1/Width或1/Height之后偏移UV。
~yPL World2Tangent
将一个世界空间向量转换到指定的切线空间中。将Face UV的次级法线与身体UV的切线法线与次级法线做点乘来取得新的向量。
float3 World2Tangent(float3 Bitangent,float3 UVMapTangent,float3 UVMapBitangent)
{
float x=dot(Bitangent,UVMapTangent);
float y=dot(Bitangent,UVMapBitangent);
float z=dot(Bitangent,float(0.5,0.5,1));
return float3(x,y,z);
}
https://zhuanlan.zhihu.com/p/447671623
~yP Layer Noise Source
将坐标传入NoiseTexture取得噪点值,NoiseTexture的参数Scale5=>2000
- Source_group
- Source_n
- Source_s
- Source_e
- Source_w
~yPL Height Process Smooth
使用~yPL Height Process
计算Source、东西南北5个,之后使用~yPL Pack ONSEW
将Source、N、S合成一个HeightONS,E、S合成ES;~yPL Pack NSEW
将Source、N、S合成AlphaONS,E、S合成ES。
~yPL Height Process
将Height (0~1)=>(-1,1)区间
- Height= (Value-0.5) * 2 * ValueMaxHeight;
- Alpha=Alpha * RemainingAlpha * Intensity;
- NormalAlpha=Alpha * Intensity;
~yPL Height Mix Smooth
- 解包ONS、EW
- 计算lerp(Prev,Height,Alpha)
- 打包成ONS、EW
~yPL Normal Process Smooth
- 解包ONS、ES
- Value=(Value /MaxHeight) * 0.5 +0.5;
- 调用
~yPL Fine Bump
~yPL Fine Bump
Tangent与Bitangent为Face UV通道的。
- Vector=float3( (w-e) * BumpHeight, (s-n) * BumpHeight, 1);
- Vector=Normalize(Vector);
- ~yPL Tangent2World(Vector,Tangent,Bitangent);
- return Vector;
~yPL Tangent2World
将一个切线空间向量转换到指定的世界空间中。 https://zhuanlan.zhihu.com/p/447671623
贴图Roughness赋予Group
外部传入0.3,未调整区域会一直为0.3。
- 使用
~yP Layer Face Roughness
使用Face UV(偏移0.25,0.75)通道采样~Ucupaint Skin Image Atlas
贴图作为Alpha来调整脸部Roughness(内部Overrider 0.5)。 - 使用
~yP Layer Face Roughness
使用UVMap UV(偏移0.25,0)通道采样~Ucupaint Skin Image Atlas2
贴图作为Alpha来调整Roughness(内部Overrider 0.6,Alpha * 0.75)。 - 使用
~yP Layer Face Roughness
使用UVMap UV(偏移0.25,0.25)通道采样~Ucupaint Skin Image Atlas2
贴图作为Alpha来调整Roughness(内部Overrider 0,Alpha)。
~yP Layer Face Roughness(脸部Roughness)
- Overrider:0.5
最外层传入Roughness为0.3,Roughness使用
~Ucupaint Skin Image Atlas
贴图对0.3~0.5进行插值。
- 使用偏移后Face 通道UV(Location 0.25 m 0.75 m 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。 - return Lerp( Roughness, 0.5, Alpha);
~yPL Mod Override Color
使用Gamma调整OverriderColor颜色,Intensity是OverriderColor与原始颜色的插值。
~yP Layer Solid Color 8.001(身体Roughness)
- Overrider:0.6
- 使用偏移后UVMap 通道UV(Location 0.25 m 0 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas2
贴图,作为Alpha。 - return Lerp( Roughness, 0.6f, Alpha * 0.75);
~yP Layer Solid Color 8(身体Roughness 水滴光滑效果)
- Overrider:0
- 使用偏移后UVMap 通道UV(Location 0 0 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas2
贴图,作为Alpha。 - return Lerp( Roughness, 0, Alpha );
~yP Layer Solid Color 6.002(脸部Roughness 水滴处的Color、Roughness、Normal)
- BaseColor Overrider:0
- Roughness Overrider:0.1 该节点用于制作水渍效果,Color最终使用TransitionAO输出的结果;
- 使用
~yPL Neighbor UV
计算东南西北方向的UV偏移值。 - 使用Source与东南西北4个坐标偏移过坐标,在偏移(0,0.75)后,采样
~Ucupaint Skin Image Atlas
贴图。
~yPL Transition AO_Copy
将InputRPG与AO Color(默认为0)进行混合。增加水滴处的AO效果
~yP Layer Solid Color.002(眼白白色)
将眼白区域从皮肤颜色设置成眼白的颜色。
~yP Layer Blush(腮红)
脸上的腮红效果。
- 对float3(0.749082 0.025 1)执行Gamma0.455,作为绘制颜色。
- 使用偏移后Face 通道UV(Location 0 0.5 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。与外部传入颜色进行混合。
~yP Layer Solid Color 7(腮红上的红色斜杠)
- 使用偏移后Face 通道UV(Location 0.75 0.75 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。与外部传入颜色进行混合。
~yP Layer Lips(嘴唇 红色)
- 使用偏移后Face 通道UV(Location 0.25 0.5 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。与外部传入颜色进行混合。
~yP Layer Tongue(舌头 红色 以及法线调整)
这里使用了顶点色作为Mask。
- 使用偏移后Face 通道UV(Location 0.25 0.5 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。
~yP Layer Nose Blush(鼻尖处的红)
- 使用偏移后Face 通道UV(Location 0.5 0.5 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。
~yP Layer Solid Color 6(眼白上部的黑色阴影)
- 使用偏移后Face 通道UV(Location 0.75 0.25 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。
~yP Layer Pupil
虹膜底层(灰色),Roughness为0。
~yP Layer Solid Color 1.001
虹膜底色(红)
~yP Layer Solid Color 2
虹膜下部高光(粉色)
~yP Layer Solid Color 3
虹膜下部的自定义高光(白色)
~yP Layer Solid Color 4
虹膜底部高光(白色)
~yP Layer Solid Color.003
瞳孔(黑色)
~yP Layer Group
将之前计算身体、脸部细节与瞳孔合并到一起。
将NormalHeight Group与NormalHeight Alpha Group(这2个Pin没有连接外部数据,默认都为0),解包Source与4方向 的用于计算法线的Height值以及Alpha。- 使用Mask Pupil顶点色作为Mask以及Alpha,将身体、脸部细节与瞳孔混的BaseColor、Metallic、Roughness、Normal合在一起。
- 瞳孔区域的Metallic为0,Normal为0。Roughness为0。
~yP Layer Solid Color 1(眉毛)
- 使用偏移后Face 通道UV(Location 0.25 0 0,Scale 0.25 0.25 1) Source以及东西南北4方向偏移过的UV,去采样
~Ucupaint Skin Image Atlas
与~Ucupaint Skin Image Atlas 1
。实际上用的是~Ucupaint Skin Image Atlas 1
mask。 - 使用Extra Lines(耳朵里的一些线条Mask,为了让耳朵有立体感)作为Mask,以20%的占比与眉毛Mask合并到一起。
- Color使用 float3(0.073) 与传入颜色混合;Roughness使用0.66与传入Roughess混合;Norma使用模型Normal与之前计算的Normal混合。
~yP Layer Fake Lighting(全身)
模拟出皮肤SSS以及环境光照效果。
- 使用
~yPL Hemi_Copy.005
计算取得Ramp混合Alpha。 - 传入ColorRamp节点,取得Color与Alpha,Color之后还会执行Gamma(0.454)。
- 使用Head的顶点色做Mask,减淡50%。之后再对整个Alpha * 0.5。
- 使用Alpha对传入颜色进行混合,最后输出。
~yPL Hemi_Copy.005
- 指定一个摄像机空间的法线向量 ViewNormal,转换到世界空间。与模型法线做点乘。
- 将点乘结果(-1,1) -> (0,1)后输出,作为Ramp混合Alpha。
~yP Layer Red Skin (肩部区域与手指)
模拟出皮肤SSS的红润效果。
- 使用偏移后UVMap 通道UV(Location 0.75 0.5 0,Scale 0.25 0.25 1)采样
~Ucupaint Skin Image Atlas
贴图,作为Alpha。 - Alpha=Alpha * 0.25;
- return lerp( Color,指定的红色,alpha);
~yP Layer Solid Color 6.004(耳朵)
耳朵加上些AO。
~yP Layer Skin AO (皮肤上的AO效果)
和#~yP Layer Fake Lighting(全身)一样:
- 采用dot(ViewVector,Normal)传入ColorRamp,得到Color作为Alpa。
- Alpha=Alpha * 0.75;
- return lerp(Color,指定AO颜色,Alpha);
头发
与身体大致相同,但区别在于:
- Anisotropic:0=>1
- Tangent:连接Tangent节点(ForTangent UV通道)
- 连接Pin:
- Color
- Roughness
- ColorAlpha
要点:
~yP Layer Gradient.003
提亮批发部分亮度,提高层次感觉。~yP Layer Solid Color.005
模拟出一个正面打光的AO阴影效果。
Group
~yP Layer Solid Color 1.002
- 使用顶点色(Mask VCol,除了眉毛处有点黑其他都是白色)作为Alpha2传入
~yPL Straight Over Mix
与外部传入的Color与ColorAlpha进行计算。() - 最终输出Color与ColorAlpha。
~yP Layer Gradient.003
对披下的长发区域进行梯度提亮。
- 使用
~yP Modifiers Gradient
计算Color与Alpha之后与输入的Color进行混合。
~yP Layer Fake Lighting.001
模拟出一个头顶往下打光的灯光效果。
- 使用dot(WorldNormal,指定世界坐标正面朝上的Vector)制作Alpha
- 将Alpha传入ColorRamp取得Ramp值。
- Color=Ramp * 0.1+Color;
~yPL Hemi_Copy.002
- 使用dot(WorldNormal,指定世界坐标正面向上的Vector)
- 将点乘值 (-1,1)=>(0,1)
- 进行正反面fix后输出。(反面不应该收到光照)
~yP Layer Solid Color.005
同~yP Layer Fake Lighting.001
,模拟出一个正面打光的AO阴影效果。
衣服
- 次表面方法换成了Christensen-Burley(但依然没有开启次表面)
- 有意思的是开启了ClearCoat材质效果,让衣服有了一些变色的感觉
要点
~yP Layer Solid Color 3.001
叠加了一个从下往上的Ramp,让上部分的衣服显得更紫,更加不透一些。~yP Layer Solid Color 2.001
实现出一种菲尼尔效果。~yP Layer Fake Lighting 1.001
AO贴图与Fake灯光混合。(应该只有AO效果)~yP Layer Fake Lighting 1
GroupNode
yP Layer Solid Color 1.003_remove
用于设置2个袖口的颜色与Alpha 。
~yP Layer Solid Color.006
用于设置身前肚兜的颜色与Alpha。
- Fake了一个从下往上打的灯光,并且设置了Ramp
- 使用
~yPL Straight Over Mix
对外部传入的Color与Alpha进行混合。
~yP Layer Solid Color 3.001
叠加了一个从下往上的Ramp(根据UV),让上部分的衣服显得更紫,更加不透一些。
~yP Layer Solid Color 4.001
对2个袖子的开头与结尾处叠加一些紫色。根据~Ucupaint Cloth Image Atlas
(0.25,0.25)
~yP Layer Pattern Sleeve
袖子上的图案。
~yP Layer Solid Color 5.001
胸前衣服的图案。
~yP Layer Solid Color 2.001
实现出一种菲尼尔效果。
- dot(指定摄像机空间向量 float3(0,0,1),WorldNormal),传入Ramp,作为Alpha。
- 与传入Alpha、Color,以及内部指定颜色进行混合。
~yP Layer Fake Lighting 1.001
- dot(指定摄像机空间向量 float3(0,0,-1),WorldNormal),传入Ramp,作为Alpha。
- 使用贴图
Cloth AO
的值 与 Ramp混合。
~yP Layer Fake Lighting 1
对衣服上的褶皱添加高光效果。
~yP Layer Solid Color 6.003
增加菲尼尔AO效果。