324 lines
14 KiB
Markdown
Raw Normal View History

2023-06-29 11:55:02 +08:00
---
title: YusufUmar_kama分析
date: 2022-08-15 13:31:52
excerpt:
tags: 卡通渲染
rating: ⭐⭐
---
- 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 Atlas2`UVMap 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)。
```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 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的切线法线与次级法线做点乘来取得新的向量。~~
```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合成一个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 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与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效果。