diff --git a/03-UnrealEngine/卡通渲染相关资料/卡通渲染开发总览.md b/03-UnrealEngine/卡通渲染相关资料/卡通渲染开发总览.md index 5b7f624..8ac14bb 100644 --- a/03-UnrealEngine/卡通渲染相关资料/卡通渲染开发总览.md +++ b/03-UnrealEngine/卡通渲染相关资料/卡通渲染开发总览.md @@ -100,7 +100,9 @@ rating: ⭐⭐⭐ 9. [ ] TODO:Nanite模型支持。 10. [ ] TODO:另一种思路定点内扩+Stencil的方式渲染内描边? 4. [ ] TODO:RayTacing描边方法。 -7. [ ] ToonPostProcess +7. [ ] ToonLighting + 1. [ ] Cel +8. [ ] ToonPostProcess 1. [x] ToonBloom 2. [ ] ToonDiffusion:对场景亮部进行降采样,之后将亮度信息叠加到Toon物体的暗部上。 3. [ ] 晕染效果,Background透过光功能。[[幻塔-Background透过光.png]] @@ -109,23 +111,23 @@ rating: ⭐⭐⭐ 1. [ ] CCA Tonemapping 2. [ ] GT Tonemapping https://github.com/yaoling1997/GT-ToneMapping 3. [ ] AGX Tonemapping https://github.com/EaryChow/AgX -8. [ ] ToonRimLighting +9. [ ] ToonRimLighting 1. [ ] 后处理边缘光 2. [ ] Matcap 3. [ ] ASoul边缘光 -9. [ ] Reflection控制 -10. [ ] Toon GI(Lumen) +10. [ ] Reflection控制 +11. [ ] Toon GI(Lumen) 1. [ ] 向下采样 2. [ ] 平滑法线采样 -11. [ ] 阴影控制 +12. [ ] 阴影控制 1. [x] 控制深度偏移 1. [x] 在材质中使用ShadowPassSwitch再对ViewSpace的Z轴方向(使用DirectionalLightVector比较可以只对方向光进行偏移)进行WPO偏移实现。 2. [ ] ContactShadow接触阴影实现衣服细节的DetailShadow - 3. [x] 半程阴影(DirectionOffsetToViewShadow) -12. [ ] ToonTranslucent + 3. [x] 半程阴影(DirectionOffsetToViewShadow)半分阴影[[幻塔-半程自阴影.png]] +13. [ ] ToonTranslucent 1. [ ] 通过模仿SingleLayerWater实现折射效果 https://zhuanlan.zhihu.com/p/657928532 2. [ ] 眉眼细节 [[幻塔-眉眼细节.png]] -13. [ ] 实现前向混合管线?思路有2:1. Material直接计算光照结果。2. 自定义ToonBasePass到LightingPass后,复制阴影贴图与Lumen渲染结果进行Composition。 +14. [ ] 实现前向混合管线?思路有2:1. Material直接计算光照结果。2. 自定义ToonBasePass到LightingPass后,复制阴影贴图与Lumen渲染结果进行Composition。 1. 原神早期的方案: 1. 渲染地形(远景 2. @@ -136,39 +138,37 @@ rating: ⭐⭐⭐ 6. 渲染深度与法线Buffer。 7. 渲染级联阴影。 8. 合成,阴影与环境光照(AO、环境探针)。 -14. [ ] 云彩生成器 +15. [ ] 云彩生成器 1. [ ] https://www.bilibili.com/video/BV1L5kdYFEXc/?spm_id_from=333.1007.tianma.4-1-11.click&vd_source=d47c0bb42f9c72fd7d74562185cee290 2. [ ] 风格化水面资产 https://item.taobao.com/item.htm?id=865360489543&pisk=gLHsX7NMiNb1gB7njFKURXly5Dwb5q9y1iZxqmBNDReTkigKDtQA6-FLJorOMSU2sqNju2VxQRoZRGDIPtWwSCmAh-yvzUJyUcman-Lyk8kOUGq4mNUAurCKv-rjPdNAXcmgnrIFkQlKjZg5RK5YDrKQpor7k-EYW9KQcuaYHPFAJ6E8JrexkSIdJuZ5MZCTHkKQju5OBoeYvMEaVtBtk-KIvyqxnDXQDCZ-fHz1qUDkpeKgJtBxdlNpTcUKrr-4i5TjbyXvy1Zg1coTRtBxKXkPllz9ZMz0QPDbfqvlIRFjTAVoQeBsl20KBSDp8B00QuV-MD-lTPDIQvFsCU1uCX3nd5DOWhqtsqDbQx71hDMb57HTOKx0CDEYdbneq6zidAkL1AT5ZPMiDjPItNTUuboEBWgJ89g0GXkgZA8dC4IyzTz7sJ5fA7XbAz-BAsf0xzPwqJ_edaNTxlTyAH_Gi5E3AmtBAsDg6kqF6HtCWc1..&spm=a21xtw.29178619.product_shelf.74.41727d6dRCDvul -15. [ ] 添加Debug View https://zhuanlan.zhihu.com/p/668782106 -16. [ ] [_UE5_ Shader Print系统](https://zhuanlan.zhihu.com/p/637929634) -17. [ ] GBufferView实现。 -18. [ ] Toon Debug模式,可以让美术在材质进行进行简单的光照计算。 -19. [ ] ToonShadow +16. [ ] 添加Debug View https://zhuanlan.zhihu.com/p/668782106 +17. [ ] [_UE5_ Shader Print系统](https://zhuanlan.zhihu.com/p/637929634) +18. [ ] GBufferView实现。 +19. [ ] Toon Debug模式,可以让美术在材质进行进行简单的光照计算。 +20. [ ] ToonShadow 1. ![[星穹铁道中下巴阴影处理.png]] 2. [ ] ToonSDFShadow 1. [ ] TODO: SDF贴图工具? - 3. [ ] ShadowPass https://zhuanlan.zhihu.com/p/619718145 - 1. [ ] 半分阴影[[幻塔-半程自阴影.png]] -20. [ ] LookDev场景 +21. [ ] LookDev场景 1. [ ] https://zhuanlan.zhihu.com/p/394608910 -21. [ ] 考虑往GBuffer中添加更多数据(考虑Velocity以及SingleLayerWater) +22. [ ] 考虑往GBuffer中添加更多数据(考虑Velocity以及SingleLayerWater) 1. ShaderMaterialDerivedHelpers.cpp(Shader宏)、GBufferInfo.cpp(GBuffer格式)BasePassRendering.cpp(950行,SingleLayerWater写入GBuffer格式相关) 2. 确定一下SingleLayerWater中VSMFiter与DistanceFieldShadow对渲染结果的影响,之后在文档中说明。 -22. [ ] 修复SIngleLayerWater的缩略图渲染渲染错误(双击会有一瞬间的错误产生) -23. [ ] 添加对应的Stat https://zhuanlan.zhihu.com/p/716644594 -24. [ ] ToonLumen、GI以及晕染效果实现。![[卡通渲染晕染效果.mp4]] -25. [ ] 在材质中实现ToonEye相关效果 +23. [ ] 修复SIngleLayerWater的缩略图渲染渲染错误(双击会有一瞬间的错误产生) +24. [ ] 添加对应的Stat https://zhuanlan.zhihu.com/p/716644594 +25. [ ] ToonLumen、GI以及晕染效果实现。![[卡通渲染晕染效果.mp4]] +26. [ ] 在材质中实现ToonEye相关效果 1. 【二次元人物眼睛如何变形?】 https://www.bilibili.com/video/BV14M4m1y71A/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e 1. 原视频 https://www.youtube.com/watch?v=euIyX9v8rvw 2. 眼睛建模 https://youtu.be/s2_7Q2IIvNY?si=fWiYjqcLFXzdeQ-B&t=126 -26. 尝试实现Forward+ +27. 尝试实现Forward+ 1. BasePass https://zhuanlan.zhihu.com/p/618698467 -27. DX11问题修复 +28. DX11问题修复 1. [x] ToonOutline SceneColorTexture为空的问题。 **DX11限制,必须CopyTexture** -28. 卡通渲染针对TAA的优化思路 https://zhuanlan.zhihu.com/p/678876237 +29. 卡通渲染针对TAA的优化思路 https://zhuanlan.zhihu.com/p/678876237 1. https://www.bilibili.com/video/BV1BK411v7FY/?spm_id_from=333.788&vd_source=ea6df38502a795b7533aa33b78bf1159 2. https://zhuanlan.zhihu.com/p/20786650 -29. [ ] Unreal Engine 5.4 Scene Extension https://zhuanlan.zhihu.com/p/706268007 +30. [ ] Unreal Engine 5.4 Scene Extension https://zhuanlan.zhihu.com/p/706268007 1. [ ] 通过SceneExtension改进ToonObjectID,这样可以减少对应ToonBuffer的精度来存其他数据。 2. [ ] https://www.bilibili.com/video/BV1fM4m1U7Tp/ diff --git a/03-UnrealEngine/卡通渲染相关资料/演讲笔记/JasonMa/JasonMa渲染方案分析.md b/03-UnrealEngine/卡通渲染相关资料/演讲笔记/JasonMa/JasonMa渲染方案分析.md index ccfd108..d7363ef 100644 --- a/03-UnrealEngine/卡通渲染相关资料/演讲笔记/JasonMa/JasonMa渲染方案分析.md +++ b/03-UnrealEngine/卡通渲染相关资料/演讲笔记/JasonMa/JasonMa渲染方案分析.md @@ -459,21 +459,24 @@ FDirectLighting ToonBxDF(FGBufferData GBuffer, half3 N, half3 V, half3 L, float ```c++ ...    float3 LightColorAndAttenuation = AreaLight.FalloffColor * MooaToonContext.LightColor * Falloff; -    ColorSaturationPowerAndScale(LightColorAndAttenuation, View.MooaLightSaturationScale); ... ... - float DiffuseColorRampU = min3(saturate(Shadow.SurfaceShadow + HairShadowOffset), GBuffer.GBufferAO, ShadowGradient); - half4 DiffuseColorRamp = SampleGlobalRamp(View.MooaGlobalDiffuseColorRampAtlas, DiffuseColorRampU, ToonGBuffer.DiffuseColorRampIndex, View.MooaGlobalDiffuseColorRampAtlasHeight); - Shadow.SurfaceShadow = DiffuseColorRampU; - - half3 ToonDiffuseColor = GBuffer.DiffuseColor; - half3 ToonShadowColor = ToonGBuffer.MainLightShadowColor * (1 - GBuffer.Metallic) * GetShadowColorIntensity(MooaToonContext); -#if USE_DEVELOPMENT_SHADERS - ToonShadowColor *= View.DiffuseOverrideParameter.w + View.DiffuseOverrideParameter.xyz; -#endif - ToonDiffuseColor = lerp(ToonShadowColor, ToonDiffuseColor, DiffuseColorRamp.a); - - Lighting.Diffuse = Diffuse_Lambert(ToonDiffuseColor) * DiffuseColorRamp.rgb * LightColorAndAttenuation; + // Diffuse + BRANCH if (Context.IsMainLight) + { + Shadow.SurfaceShadow = saturate(Shadow.SurfaceShadow + HairShadowValueOffset + MooaToonData.MainLightShadowValueOffset * 2.0f - 1.0f); + LightColorAndAttenuation *= Shadow.SurfaceShadow; + float3 MainLightShadowColor = MooaToonData.MainLightShadowColor * lerp(1, Context.LightColor, MooaToonData.MainLightShadowApplyLightColor) * View.MooaIsGlobalIlluminationEnabled; + Lighting.Diffuse = lerp(MainLightShadowColor, GBuffer.BaseColor * Context.LightColor, Shadow.SurfaceShadow) * PI_INV; + } + else + { + float OtherLightShadowValue = ToonStep(halfNoL, MooaToonData.OtherLightDiffuseFeather, MooaToonData.OtherLightDiffuseThreshold); + // Non-Directional light's SurfaceShadow contains distance attenuation, not just shadowmap + Shadow.SurfaceShadow *= saturate(OtherLightShadowValue + HairShadowValueOffset); + LightColorAndAttenuation *= Shadow.SurfaceShadow; + Lighting.Diffuse = GBuffer.BaseColor * LightColorAndAttenuation * PI_INV; + } ``` # 实用函数 @@ -495,4 +498,3 @@ void GetDistanceFieldFacialShadow(FGBufferData GBuffer, FToonGBufferData ToonGBu } ``` -