作者:广东暖暖_小乖 | 来源:互联网 | 2024-12-11 11:21
本文探讨了UE4中Decal贴花在静态光照条件下无法正确渲染的问题,分析了其原因,并提供了针对不同平台(PC和移动设备)的有效解决策略。特别关注了半透明材质贴花的特殊处理方法。
在 Unreal Engine 4 (UE4) 中,Decal 贴花由于其顶点未存储光照信息,导致在静态光照环境下无法正常渲染。这一问题对于特效贴花的影响较小,但对于场景贴花则较为明显,尤其是当材质具有半透明特性时,需要在 BasePass 之后进行渲染以确保效果。
1. Decal 渲染机制解析
Decal 的渲染主要通过 MobileDecalRendering.cpp
实现,其中使用矩阵变换将 FrustumComponentToClip
传递给 Pixel Shader,以将组件投影至裁剪空间,从而直接替换组件表面的材质属性。在 Pixel Shader 阶段,系统会逐像素地剔除并覆盖材质属性,最终将贴花投影到屏幕空间。
2. 解决方案
2.1 PC 平台
对于 PC 端,可以直接启用 DBuffer 来解决排序问题,这有助于改善 Decal 在静态光照下的表现。具体操作可参考官方文档:UE4: Solution to Decals Not Rendering/Showing in Indirect Static Lighting。
2.2 移动平台
在移动平台上,可以通过修改 DeferredDecal.usf
文件中的 Pixel Shader 代码来计算静态天光的 BaseColor 和 Specular,从而使 Decal 能够在阴影区域正确显示。以下是实现该功能的伪代码示例:
#if ENABLE_SKY_LIGHT
float2 SkyOcclusiOnUV= 0;
uint SkyOcclusiOnDataIndex= 0u;
float3 SkyDiffuseLighting;
float3 SkySubsurfaceLighting;
VTPageTableResult LightmapVTPageTableResult = (VTPageTableResult)0.0f;
float3 VolumetricLightmapBrickTextureUVs = ComputeVolumetricLightmapBrickTextureUVs(MaterialParameters.AbsoluteWorldPosition);
GetSkyLightingForPRT(MaterialParameters, LightmapVTPageTableResult, GBufferData, DiffuseDir, SkyOcclusionUV, SkyOcclusionDataIndex, VolumetricLightmapBrickTextureUVs, SkyDiffuseLighting, SkySubsurfaceLighting);
SkyDiffuseLighting += SkySubsurfaceLighting;
IndirectColor += SkyDiffuseLighting * ShadingModelDiffuseColor;
IndirectColor += ShadingModelDiffuseColor * (SkyDiffuseLighting + SkySubsurfaceLighting) * View.IndirectLightingColorScale;
IndirectIrradiance += Luminance(SkyDiffuseLighting);
#endif
值得注意的是,UE4 自身已经处理了天光的 Specular 计算,这意味着在静态天光条件下,Decal 在阴影中的表现会有所提升。此外,还可以通过分离场景中预计算的间接光数据,直接应用于 Decal 材质,以及其他需要间接光支持的功能,进一步优化渲染效果。
3. 半透明贴花的处理
在移动设备上,由于缺乏 Mask 混合模式,需要自行添加一套处理机制。这通常涉及对 DecalRenderingShared.cpp
文件的修改,以支持半透明材质的正确渲染。经过这样的调整后,贴花的效果会更加自然,看起来更加真实。