--- title: YusufUmar_kama分析 date: 2022-08-15 13:31:52 excerpt: tags: 卡通渲染 rating: ⭐⭐ --- - Skin - Hair - Cloth - Glod - Lotus - LotusLeaf - Water Surface # 皮肤 根节点使用了Principed BSDF,GGX,RandomWalk(Fixed Radius)。Subsurface值为0.01(开启了SSS效果),其他为默认参数。 使用Ucupaint Skin连接Pin: - Color - Roughness - Normal ## 要点: 1. 基底:皮肤颜色float3(0.846873,0.602632,0.512498)、Roughness 0.3、Metallic 0 。Subsurface:0.01 2. **皮肤哑光效果**使用Noise贴图并且使用ddx/ddy实现。 3. [[#yP Layer Fake Lighting(全身)]]效果,模拟出皮肤的SSS以及环境光照效果,增强厚涂皮肤的质感。 4. [[#yP Layer Red Skin (肩部区域与手指)]]效果,模拟皮肤的SSS效果,增强厚涂皮肤的质感。 5. [[#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)。 ```hlsl 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。 https://www.bilibili.com/video/BV1RD4y1d7c3?spm_id_from=333.337.search-card.all.click&vd_source=d47c0bb42f9c72fd7d74562185cee290 ### ~yP Lyaer Noise 经过测试,好像没有区别 1. 使用Neighbor UV(将UVMap的Tangent、Bitangent转换到Face的切线空间)来获得东西南北4个偏移方向。传入Layer Noise Source,得到Source、东西南北5个Noise随机Height值。 2. 将Noise随机高度值从(0,1)->(-1,1),之后与PrevHeight融合(这里不融合) 3. Height=Height/MaxHeight,之后将Height从(-1,1)->(0,1) 4. 使用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的切线法线与次级法线做点乘来取得新的向量。~~ ```c++ 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。 1. 使用`~yP Layer Face Roughness`使用Face UV(偏移0.25,0.75)通道采样`~Ucupaint Skin Image Atlas`贴图作为Alpha来调整脸部Roughness(内部Overrider 0.5)。 2. 使用`~yP Layer Face Roughness`使用UVMap UV(偏移0.25,0)通道采样`~Ucupaint Skin Image Atlas2`贴图作为Alpha来调整Roughness(内部Overrider 0.6,Alpha * 0.75)。 3. 使用`~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进行插值。 1. 使用偏移后Face 通道UV(Location 0.25 m 0.75 m 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。 2. return Lerp( Roughness, 0.5, Alpha); #### ~yPL Mod Override Color 使用Gamma调整OverriderColor颜色,Intensity是OverriderColor与原始颜色的插值。 ### ~yP Layer Solid Color 8.001(身体Roughness) - Overrider:0.6 1. 使用偏移后UVMap 通道UV(Location 0.25 m 0 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas2`贴图,作为Alpha。 2. return Lerp( Roughness, 0.6f, Alpha * 0.75); ### ~yP Layer Solid Color 8(身体Roughness 水滴光滑效果) - Overrider:0 1. 使用偏移后UVMap 通道UV(Location 0 0 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas2`贴图,作为Alpha。 2. return Lerp( Roughness, 0, Alpha ); ### ~yP Layer Solid Color 6.002(脸部Roughness 水滴处的Color、Roughness、Normal) - BaseColor Overrider:0 - Roughness Overrider:0.1 该节点用于制作水渍效果,Color最终使用TransitionAO输出的结果; 1. 使用`~yPL Neighbor UV`计算东南西北方向的UV偏移值。 2. 使用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(腮红) 脸上的腮红效果。 1. 对float3(0.749082 0.025 1)执行Gamma0.455,作为绘制颜色。 2. 使用偏移后Face 通道UV(Location 0 0.5 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。与外部传入颜色进行混合。 ### ~yP Layer Solid Color 7(腮红上的红色斜杠) 1. 使用偏移后Face 通道UV(Location 0.75 0.75 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。与外部传入颜色进行混合。 ### ~yP Layer Lips(嘴唇 红色) 1. 使用偏移后Face 通道UV(Location 0.25 0.5 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。与外部传入颜色进行混合。 ### ~yP Layer Tongue(舌头 红色 以及法线调整) 这里使用了顶点色作为Mask。 1. 使用偏移后Face 通道UV(Location 0.25 0.5 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。 ### ~yP Layer Nose Blush(鼻尖处的红) 1. 使用偏移后Face 通道UV(Location 0.5 0.5 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。 ### ~yP Layer Solid Color 6(眼白上部的黑色阴影) 1. 使用偏移后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 将之前计算身体、脸部细节与瞳孔合并到一起。 1. ~~将NormalHeight Group与NormalHeight Alpha Group(这2个Pin没有连接外部数据,默认都为0),解包Source与4方向 的用于计算法线的Height值以及Alpha。~~ 2. 使用Mask Pupil顶点色作为Mask以及Alpha,将身体、脸部细节与瞳孔混的BaseColor、Metallic、Roughness、Normal合在一起。 3. 瞳孔区域的Metallic为0,Normal为0。Roughness为0。 ### ~yP Layer Solid Color 1(眉毛) 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。 2. 使用Extra Lines(耳朵里的一些线条Mask,为了让耳朵有立体感)作为Mask,以20%的占比与眉毛Mask合并到一起。 3. Color使用 float3(0.073) 与传入颜色混合;Roughness使用0.66与传入Roughess混合;Norma使用模型Normal与之前计算的Normal混合。 ### ~yP Layer Fake Lighting(全身) 模拟出皮肤SSS以及环境光照效果。 1. 使用`~yPL Hemi_Copy.005`计算取得Ramp混合Alpha。 2. 传入ColorRamp节点,取得Color与Alpha,Color之后还会执行Gamma(0.454)。 3. 使用Head的顶点色做Mask,减淡50%。之后再对整个Alpha * 0.5。 4. 使用Alpha对传入颜色进行混合,最后输出。 #### ~yPL Hemi_Copy.005 1. 指定一个摄像机空间的法线向量 ViewNormal,转换到世界空间。与模型法线做点乘。 2. 将点乘结果(-1,1) -> (0,1)后输出,作为Ramp混合Alpha。 ### ~yP Layer Red Skin (肩部区域与手指) 模拟出皮肤SSS的红润效果。 1. 使用偏移后UVMap 通道UV(Location 0.75 0.5 0,Scale 0.25 0.25 1)采样`~Ucupaint Skin Image Atlas`贴图,作为Alpha。 2. Alpha=Alpha * 0.25; 3. return lerp( Color,指定的红色,alpha); ### ~yP Layer Solid Color 6.004(耳朵) 耳朵加上些AO。 ### ~yP Layer Skin AO (皮肤上的AO效果) 和[[#~yP Layer Fake Lighting(全身)]]一样: 1. 采用dot(ViewVector,Normal)传入ColorRamp,得到Color作为Alpa。 2. Alpha=Alpha * 0.75; 3. 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 1. 使用顶点色(Mask VCol,除了眉毛处有点黑其他都是白色)作为Alpha2传入`~yPL Straight Over Mix`与外部传入的Color与ColorAlpha进行计算。() 2. 最终输出Color与ColorAlpha。 ### ~yP Layer Gradient.003 对披下的长发区域进行梯度提亮。 1. 使用`~yP Modifiers Gradient`计算Color与Alpha之后与输入的Color进行混合。 ### ~yP Layer Fake Lighting.001 模拟出一个头顶往下打光的灯光效果。 1. 使用dot(WorldNormal,指定世界坐标正面朝上的Vector)制作Alpha 2. 将Alpha传入ColorRamp取得Ramp值。 3. Color=Ramp * 0.1+Color; #### ~yPL Hemi_Copy.002 1. 使用dot(WorldNormal,指定世界坐标正面向上的Vector) 2. 将点乘值 (-1,1)=>(0,1) 3. 进行**正反面**fix后输出。(反面不应该收到光照) ### ~yP Layer Solid Color.005 同`~yP Layer Fake Lighting.001`,模拟出一个正面打光的AO阴影效果。 # 衣服 - 次表面方法换成了Christensen-Burley(但依然没有开启次表面) - 有意思的是开启了ClearCoat材质效果,让衣服有了一些变色的感觉 ## 要点 1. `~yP Layer Solid Color 3.001` 叠加了一个从下往上的Ramp,让上部分的衣服显得更紫,更加不透一些。 2. `~yP Layer Solid Color 2.001` 实现出一种菲尼尔效果。 3. `~yP Layer Fake Lighting 1.001` AO贴图与Fake灯光混合。(应该只有AO效果) 4. `~yP Layer Fake Lighting 1` ## GroupNode ### yP Layer Solid Color 1.003_remove 用于设置2个袖口的颜色与Alpha 。 ### ~yP Layer Solid Color.006 用于设置身前肚兜的颜色与Alpha。 1. Fake了一个从下往上打的灯光,并且设置了Ramp 2. 使用`~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 实现出一种菲尼尔效果。 1. dot(指定摄像机空间向量 float3(0,0,1),WorldNormal),传入Ramp,作为Alpha。 2. 与传入Alpha、Color,以及内部指定颜色进行混合。 ### ~yP Layer Fake Lighting 1.001 1. dot(指定摄像机空间向量 float3(0,0,-1),WorldNormal),传入Ramp,作为Alpha。 2. 使用贴图`Cloth AO`的值 与 Ramp混合。 ### ~yP Layer Fake Lighting 1 对衣服上的褶皱添加高光效果。 ### ~yP Layer Solid Color 6.003 增加菲尼尔AO效果。