2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5 デカール距離カリングの実装(Implementing decal distance culling)

Last updated at Posted at 2024-03-03

概要

デカールをカメラの距離によってカリングされるようにエンジン改造をしていきます。
実装した環境はUE5.1になります。
すでに「Fade Screen Size」という画面サイズでカリングする機能がありますが、
個別に設定するのは面倒&使いづらいので一括の距離でカリングされるようにします。

実装

最初はカリング距離を調整できるようにコマンドを作成します。

DecalRenderingShared.cpp 24行
static TAutoConsoleVariable<float> CVarDistanceCulling(
	TEXT("r.Decal.DistanceCulling"),
	5000.0f,
	TEXT("Culls decals by distance.")
);

次は下記のコードのように書きます。
まずは、カメラの位置座標とデカールの位置座標の差分を求めます。
そのまま平方根で距離を求めたいのですが「DistancePosition」と「DistanceCulling」両方を二乗すればいいので、二乗して割り算を行い0~1のフェード値を取得します。
そのままだとだんだん消えていくのですが、最後の方に急激に消えて欲しいので、
イージング関数の一つ「easeInQuint」を導入しています(Fade * Fade * Fade * Fadeの部分)。
最後に0~1を1~0にするように反転処理を行います。
「CalculateDecalFadeAlpha」は必要ないので削除します。

DecalRenderingShared.cpp 327行
if (bIsPerspectiveProjection && Data.Proxy.FadeScreenSize != 0.0f)
{
	//Data.FadeAlpha = CalculateDecalFadeAlpha(Data.Proxy.FadeScreenSize, ComponentToWorldMatrix, View, FadeMultipli
    
	float DistanceCulling = CVarDistanceCulling.GetValueOnRenderThread();
	FVector DistancePosition = View.ViewMatrices.GetViewOrigin() - ComponentToWorldMatrix.GetOrigin();
	float Fade = FMath::Clamp(DistancePosition.SizeSquared() / FMath::Square(DistanceCulling), 0.0f, 1.0f);
	Fade = Fade * Fade * Fade * Fade;
	Data.FadeAlpha = 1 - Fade;
}

「Data.FadeAlpha」を0にすると描画されませんので結果的にカリングされます。

結果

DecalFadeEaseInQuint.gif

まとめ

デカールを距離でカリングすることで、GPU、CPUの最適化が行い安くなりました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?