324 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| 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效果。 |