UE4 Decal 贴花不在静态光照下绘制

Decal顶点没有烘焙的光照数据,因此无法在含前向管线的阴影下绘制。特效贴花为unlit自发光材质,阴影下表现影响不大。而场景Decal需要计算光照。
阴影下不绘制

1. Decal实现原理

MobileDecalRendering.cpp
通过矩阵变换 得到FrustumComponentToClip,传入Pixel shader将组件投影到裁剪空间,直接替换组件表面材质属性
在PixelShader中逐像素剔除,覆盖材质属性,投影到屏幕空间
Decal Render

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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看起来就没有那么透明

猜你喜欢

转载自blog.csdn.net/qq_34813925/article/details/120605016