--- 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]] - ShadowSideColor(ToonSkin为SubsurfaceColor):次表面颜色贴图,用于控制身体各部位的次表面颜色。比如嘴唇、手指等部位因为毛细血管较多会显得比较红。美术需要根据需求进行绘制。 - ToonDataA: - R:ShadowOffset,用于偏移赛璐璐的光影分界面位置。 ToonSkin未使用。 - G:用于指定ToonDataID,与ToonWorldSettings中ToonData的Index对应。 - B:为天光渲染结果与ShadowSideColor的混合因子。ToonSkin未使用。 - A:未使用 - ToonDataB: - RGB:OutlineColor - A:OutlineMask - ToonDataC: - RGB:描边用的IDTexture - A:OutlineWidth 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]] - IBLMultiplier:HDR贴图反射效果强度。 - IBLMultiplierRangeByLuminanceMax: - IBLMultiplierRangeSmooth:HDR贴图反射过渡效果。 - IBLMultiplierRangeAOMask:AO对于HDR贴图反射的影响倍率。 - BloomMultiplier:控制指定部位的“辉光”效果的强度。 ### 全局贴图说明 这些贴图都存放在`Engine\Content\EngineMaterials\ToonTexture`中。为了保证效果需要确保这些贴图的CompressionSettings为`VectorDisplacementmap(RGBA8)`。其中ToonDataTexture与ToonSkinData贴图的Filter设置成`Nearest`。 - ToonStandard与ToonHair相关: - ToonRampTexture:ToonStandard与ToonHair的存储调整阴影分界面偏移与软硬度Ramp数据的贴图,通过ID来采样指定的行。 - ToonDataTexture :ToonStandard与ToonHair的存储Toon数据贴图,通过ID来采样指定的行。 - ToonSkin相关: - PreIntegratedToonSkinBRDFTexture :ToonSkin专用的PreIntegrated贴图。 - ToonSkinFalloffMaskTexture :ToonSkin专用的存储调整阴影分界面偏移与软硬度Ramp数据的贴图,通过ID来采样指定的行。 - ToonSkinTransmissionMaskTexture :ToonSkin用于调整Transmission Alpha的贴图,通过ID来采样指定的行。 - ToonSkinDataTexture:ToonSkin的存储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月 早上7:20~7:40分。可以看到与上图类似的冷暖打光效果。 ![](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效果。 - SNNSampleRadius:SNN的采样半径(远处)。采样半径越大油画效果越强。 - SNNMinSampleRadius:SNN的近距离插值的最小采样半径。0即为近距离不采样。 - SNNStartInterpolateDistance:SNN强度开始插值的距离 - SNNEndInterpolateDistance:SNN强度结束插值的距离 ## 用户使用说明 ### 前置步骤 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`。