14 KiB
Raw Blame History

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 BSDFGGXRandomWalkFixed Radius。Subsurface值为0.01开启了SSS效果其他为默认参数。

使用Ucupaint Skin连接Pin

  • Color
  • Roughness
  • Normal

要点:

  1. 基底皮肤颜色float3(0.846873,0.602632,0.512498)、Roughness 0.3、Metallic 0 。Subsurface0.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 UV0.25,0.75贴图作为Alpha来赋予脸部Roughness内部Overrider 0.5)。
  • ~Ucupaint Skin Image Atlas Face UV0 00.5腮红Mask
  • ~Ucupaint Skin Image Atlas Face UV0.75,0.75腮红斜杠Mask
  • ~Ucupaint Skin Image Atlas Face UV0.25,0.75嘴唇红Mask
  • ~Ucupaint Skin Image Atlas2UVMap UV0.25,0贴图作为Alpha来赋予身体Roughness内部Overrider 0.6Alpha * 0.75)。
  • ~Ucupaint Skin Image Atlas2 UVMap UV0.25,0.25贴图作为Alpha来调整身体水渍Roughness内部Overrider 0Alpha
  • ~Ucupaint Skin Image Atlas UVMap UV (0,0.75) 是脸上的水渍贴图,用作脸部水渍高度、透明度、Roughness最后计算出Color、Roughness、Normal。内部BaseColor Overrider0 Roughness Overrider0.1Alpha

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 Process2个参数输入都是1。
  • Pupil Tangent Process2个参数输入都是1。
  • UVMap Tangent Process2个参数输入都是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的切线法线与次级法线做点乘来取得新的向量。

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合成一个HeightONSE、S合成ES~yPL Pack NSEW将Source、N、S合成AlphaONSE、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.6Alpha * 0.75)。
  3. 使用~yP Layer Face Roughness使用UVMap UV偏移0.25,0.25)通道采样~Ucupaint Skin Image Atlas2贴图作为Alpha来调整Roughness内部Overrider 0Alpha

~yP Layer Face Roughness脸部Roughness

  • Overrider0.5 最外层传入Roughness为0.3Roughness使用~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

  • Overrider0.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 水滴光滑效果)

  • Overrider0
  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 Overrider0
  • Roughness Overrider0.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为0Normal为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 1mask。
  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与AlphaColor之后还会执行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);

头发

与身体大致相同,但区别在于:

  • Anisotropic0=>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效果。