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

本文详细介绍了移动端Decal的实现原理,以及在光照处理中的挑战。针对Decal在阴影下无法正确显示的问题,提出了两种解决方案:一是PC端使用DBuffer处理排序;二是移动端通过计算Hack的stationary天光并在LightingPass中剔除,以达到在阴影中有亮度的效果。同时讨论了移动端贴花材质的透明处理,并提出了自定义混合模式的解决方案。

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

看起来就没有那么透明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值