2023-06-29 11:55:02 +08:00

324 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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效果。