168 lines
10 KiB
Markdown
Raw Normal View History

2023-06-29 11:55:02 +08:00
---
title: 厚涂风格渲染文档
date: 2022-09-13 15:25:32
excerpt: 摘要
tags:
rating: ⭐
---
# 厚涂元素分析
# 原理说明
## Material
>与ToonStandard、ToonHair不同Roughness与Metallic的作用恢复成UE默认的逻辑。
这个材质可以理解为在一个Lambert材质上叠上了一层层的效果。
- BaseColor基础颜色贴图
- Metallic控制反射强度。
- Roughness控制高光形状
- Specular控制高光强度。
- Opacity具体参考[[#Material#Opacity]]
- ShadowSideColorToonSkin为SubsurfaceColor次表面颜色贴图用于控制身体各部位的次表面颜色。比如嘴唇、手指等部位因为毛细血管较多会显得比较红。美术需要根据需求进行绘制。
- ToonDataA
- RShadowOffset用于偏移赛璐璐的光影分界面位置。 ToonSkin未使用。
- G用于指定ToonDataID与ToonWorldSettings中ToonData的Index对应。
- B为天光渲染结果与ShadowSideColor的混合因子。ToonSkin未使用。
- A未使用
- ToonDataB
- RGBOutlineColor
- AOutlineMask
- ToonDataC
- RGB描边用的IDTexture
- AOutlineWidth
ToonCustomOutput
这3个参数与间接照明有关体积光照贴图因为没有对应场景所以没办法进行测试。
- InSubsurfaceColorForIndirect修改次表面颜色对于DiffuseColorForIndirect的影响,默认为0,也就是不影响。
- InDiffuseIndirectLightingMask漫反射间接照明Mask
- InSubsurfaceIndirectLightingMask次表面间接照明Mask
### Opacity
该贴图用于控制次表面的Transmission所使用的的预积分Ramp值越大次表面颜色会越明显。使用Marmoset Toolbag烘焙出曲率贴图Curvate、厚薄度贴图Thickness为基础进行辅助绘制最终得到Opacity贴图。
我们需要对贴图进行Clamp去除较低的颜色Thickness选择大腿处的颜色为最低颜色之后将其重映射。
![|300](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/Kama_Thickness.png)
Curvate贴图我们只需要0.5~1部分的数据所以在Clamp(0.5,1)之后再将其重映射。
![|300](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/Kama_Curvature.png)
![|1500](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/ToonRendering/Subsurface_OpacityNode.png)
## ToonWorldSettings说明
为了解决延迟渲染不能传递大量参数的问题本人设计这种通过ID查询对应全局贴图来获取数据的方法。对应的参数在ToonRenderingWorldSettings中设置并且绘制即可。
ToonData目前只有2个参数是有效果
- FalloffRampCurve控制光影过渡曲线。
- BloomMultiplier控制指定部位的“辉光”效果的强度。
ToonSkinData
- FalloffRampCurve控制灯光光照的光影过渡曲线。置空则使用默认的**Lambert**衰竭曲线进行计算。
- TransmissionRampCurve控制灯光光照的次表面效果的渐变曲线。置空则使用**1-Lambert** 衰竭曲线进行计算。
- SkyLight
- SubsurfaceColorAlphaForSkyLight控制天光产生的SSS效果。
- SubsurfaceColorOpacityMultiplier控制Opacity对于天光SSS的影响强度。
- IBL参考[[#ReflectionEnvironmentAndSky#IBL]]
- IBLMultiplierHDR贴图反射效果强度。
- IBLMultiplierRangeByLuminanceMax
- IBLMultiplierRangeSmoothHDR贴图反射过渡效果。
- IBLMultiplierRangeAOMaskAO对于HDR贴图反射的影响倍率。
- BloomMultiplier控制指定部位的“辉光”效果的强度。
### 全局贴图说明
这些贴图都存放在`Engine\Content\EngineMaterials\ToonTexture`中。为了保证效果需要确保这些贴图的CompressionSettings为`VectorDisplacementmap(RGBA8)`。其中ToonDataTexture与ToonSkinData贴图的Filter设置成`Nearest`
- ToonStandard与ToonHair相关
- ToonRampTextureToonStandard与ToonHair的存储调整阴影分界面偏移与软硬度Ramp数据的贴图通过ID来采样指定的行。
- ToonDataTexture ToonStandard与ToonHair的存储Toon数据贴图通过ID来采样指定的行。
- ToonSkin相关
- PreIntegratedToonSkinBRDFTexture ToonSkin专用的PreIntegrated贴图。
- ToonSkinFalloffMaskTexture ToonSkin专用的存储调整阴影分界面偏移与软硬度Ramp数据的贴图通过ID来采样指定的行。
- ToonSkinTransmissionMaskTexture ToonSkin用于调整Transmission Alpha的贴图通过ID来采样指定的行。
- ToonSkinDataTextureToonSkin的存储Toon数据贴图通过ID来采样指定的行。
## 渲染功能
### BasePass
### DiffuseIndirectAndAO
- SSGI建议单帧画面开启。
开启SSGI
![|800](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SkyLight_DisableDistanceFields(SSGI).png)
关闭SSGI
![|800](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SkyLight_EnableDistanceFields(SSGI).png)
### Lighting
- ShadeModel ToonSkin
- 预积分实现。
### ReflectionEnvironmentAndSky
- 天光需要为Dynamic并且开启Shadow选项。
- 是否开启距离场对会让天光产生AO效果.理论上开启距离场AO后的结果才是正确的但效果并不理想所以需要调整一下天光下半球的颜色也可以作为添加细节的方法最好还是通过HDR贴图
半球0灰度
![|800](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SkyLight_EnableDistanceFields(SSGI).png)
半球20灰度
![|800](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SkyLight_EnableDistanceFields_20GrayLowSphere(SSGI).png)
天光对于SSS效果影响提升其SSS效果也可以使用ToonRenderingWorldSettings 的SubsurfaceColorAlphaForSkyLight与SubsurfaceColorOpacityMultiplier。
关闭天光:
![|200](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SSS_SkyLightDisable.png)
开启天光:
![|200](https://raw.githubusercontent.com/blueroseslol/ImageBag/master/ImageBag/ToonRendering/SSS_SkyLightEnable.png)
#### IBL
主要是为了实现类似sakimichan的部分画作有这种天光产生的效果
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20220930171440.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20220930171503.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20220930171515.png)
这样的效果一般可以通过打光来实现下图是拍摄于5~6月 早上720~740分。可以看到与上图类似的冷暖打光效果。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/ToonRendering/SkyLight_WarmCoolEffect.png)
经过若干尝试最后使用像素亮度来判断暗部与亮度Mask。最后使用ToonRenderingWorldSettings 中的IBL相关属性来控制效果。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/ToonRendering/SceneColorLumenMaskWithMask.png)
这里用了一个0.01的Smooth以及5的Multiper实际上不会那么明显。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/ToonRendering/IBLMultiperEffect.png)
其他游戏比如破晓传说也使用IBL来进行辅助打光。
将包括辅助光在内的灯光烘烤成立方体地图制作光照环境HDR贴图
- 旋转以配合光源的光轴
- 将光面与光源的方向对齐
- 有方向性的正确遮蔽
- 亮度和对比度:艺术家调整的
- 皮肤和眼睛:对比度低
- 在UE4中这可以很容易地在编辑器中改变。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221020151650.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221020151725.png)
### 后处理
相关的选项位于后处理盒子-RenderingFeatures-Toon中。
#### ToonBloom
只有一个UseToonBloom用于开启/关闭ToonBloom效果。其余的参数与自带的Bloom通用。与自带的Bloom的区别在于可以通过ToonData来控制Bloom强度以此来实现一些降低某一些区域亮度很高的区域自发光的Bloom效果不会出现过曝情况。反之也可以使得一些不太量的地方拥有较大的Bloom效果。
因为使用PBR的方式来处理Bloom很容易导致泛光部分发白。而我们需要的其实是一个带颜色的光晕。
![](https://pic4.zhimg.com/80/v2-0d8475dd3d5ea6670face528f575c48f_720w.webp)
#### SNN
油画效果。实现是的是一个近弱远强的油画效果。
- SNNPower用于开关SNN效果。
- SNNSampleRadiusSNN的采样半径远处。采样半径越大油画效果越强。
- SNNMinSampleRadiusSNN的近距离插值的最小采样半径。0即为近距离不采样。
- SNNStartInterpolateDistanceSNN强度开始插值的距离
- SNNEndInterpolateDistanceSNN强度结束插值的距离
## 用户使用说明
### 前置步骤
1. 在插件管理器确认UTToonRendering插件已经启用并在ProjectSettings->Engine->GeneralSettings->DefaultClasses中将WorldSettingsClass设置成`ToonRenderingWorldSettings`
2. 检查天光是否为Dynamic以及是否开启Shadow同时调节Lower Hemisphere Is Solid Color让其稍微亮一些。如果使用距离场阴影那角色需要有胶囊体场景也需要构建较为准确的距离场
### 角色制作顺序
1. 绘制贴图 建议使用Kama的材质
1. 除了基础的BaseColor、Metallic、Roughness、Specular、AO贴图外SubsurfaceColor与Opacity尤为重要。
2. 根据需求来绘制ToonDataB的OutlineColor、IDMapForOutline与OutlineMask贴图。
2. 在ToonRenderingWorldSettings中设置新的ToonSkinData并且在材质中修改ToonDataID使其对应。
1. FalloffRampCurve与TransmissionRampCurve比较重要。
2. 调节SubsurfaceColorAlphaForSkyLight 与SubsurfaceColorOpacityMultiplier 。
3. 适当调节后处理。
### 虚拟拍摄问题
在Project - Engine - Rendering - PostProcessing 中将Enable Alpha Channel Support in PostProcessing 设置成`Allow Throught Tonemapper`。默认是`Disable`