Decal顶点没有烘焙的光照数据,因此无法在含前向管线的阴影下绘制。特效贴花为unlit自发光材质,阴影下表现影响不大。而场景Decal需要计算光照。
1. Decal实现原理
MobileDecalRendering.cpp
通过矩阵变换 得到FrustumComponentToClip,传入Pixel shader将组件投影到裁剪空间,直接替换组件表面材质属性
在PixelShader中逐像素剔除,覆盖材质属性,投影到屏幕空间
2. 解决方法
2.1 PC端直接开启DBuffer用来处理排序问题
UE4: Solution to Decals Not Rendering/Showing in Indirect Static Lighting
2.2 移动端:
1.在UE4的光照体系下,在DeferredDecal.usf的Pixiel Shader里计算Hack的stationary天光,从而能在阴影中有个粗糙的亮度,同时用Gbuffer中的一位标记Decal,在LightingPass抠掉天光计算即可。
伪代码:
#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);
2.管线的设计上,完全分离间接光计算至LightingPass。
3.贴花偏透明
移动端贴花材质没有Mask的混合模式,自己加一套,不混合底色的
DecalRenderingShared.cpp
看起来就没有那么透明