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