1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UE4 CustomDepth についてのメモ

Posted at

概要

カスタムデプスについての基本メモ。
壁の向こう側にいるオブジェクトの表示のテストをします。

更新履歴

日付 内容
2023/01/17 初版

参考

以下の記事を参考にいたしました、ありがとうございます。
UE公式:ポストプロセスマテリアル
【UE4】CustomDepthの基本の備忘録
【UE4】複数のポストプロセスを使い分ける

環境

Windows10
Visual Studio 2017
UnrealEngine 4.26.2

CustomDepth

ステルスゲームなどでよくある壁の後ろにいるオブジェクトの色付き表示をやってみます。

レンダリング設定

対象となるアクターのメッシュコンポーネントのレンダリング設定[Render CustomDepth Pass]にチェックを入れる。
これでこのオブジェクトはカスタム深度バッファに値がはいるようになります。
RenderPassSetting.png

マテリアル作成

次にマテリアルを新規作成し、設定からマテリアルの [Material Domain] を [Post Process] に変更。
MT_Setting1.png

ポストプロセスマテリアルの [Blendable Location] を [Before Translucency] に変更。
MT_Setting2.png

次にマテリアル処理を作成します。
シーンテクスチャからシーンデプス(通常の深度)とカスタムデプス(設定したメッシュのみの深度)から差分を比較し、オブジェクトの後ろにいるかを判定し、色を変えるようにします。

MyCustomDepth.png

ポストプロセス設定

ポストプロセスボリュームのレンダリング機能から[ポストプロセスマテリアル]に先に作ったマテリアルを追加。

PostProcessSetting.png

結果

▼ポストプロセス適用前
Base.png

▼ポストプロセス適用後
Result.png

CustomStencil

前述の方法ではオブジェクト毎の色替えができないため、カスタムステンシルを使ってオブジェクト毎の色替えをしてみます。

プロジェクト設定&レンダリング設定

[編集] -> [プロジェクト設定] -> [エンジン/レンダリング/ポストプロセス] の[カスタム深度ステンシルパス] を [Enabled with Stencil] に変更。

ProjectSetting.png

対象となるアクターのメッシュコンポーネントのレンダリング設定の[CustomDepth Stencil Value]に値を設定。
StencilSetting.png

[表示モード]->[バッファの可視化]->[カスタムステンシル]で値の確認ができます。
Buffer.png

マテリアル作成

マテリアルを新規作成し、[Material Domain] を [Post Process] に変更、[Blendable Location] を [Before Translucency] に変更。

カスタムステンシル値が1の時(水色)と2の時(白)とそれ以外(緑)で色分けをする処理を書きます。
MT_Stencil.png

CustomDepthの時と同様に、ポストプロセスマテリアルに作成したマテリアルを適用します。

結果

カスタムステンシル値で色分けがされます。
Result2.png

その他

関連C++コード

▼プリミティブコンポーネント
"Engine\Source\Runtime\Engine\Classes\Components\PrimitiveComponent.h"

▼ポストプロセスボリューム
"Engine\Source\Runtime\Engine\Classes\Engine\PostProcessVolume.h"
"Engine\Source\Runtime\Engine\Classes\Engine\Scene.h"

PrimitiveComponent.h

class ENGINE_API UPrimitiveComponent : public USceneComponent, public INavRelevantInterface
{
	GENERATED_BODY()

public:

  /** true の場合、このコンポーネントはカスタムデプスパスでレンダリングされます。(通常はアウトラインに使用)*/
	UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadOnly, Category=Rendering, meta=(DisplayName = "Render CustomDepth Pass"))
	uint8 bRenderCustomDepth:1;

  /** カスタムデプスパスのステンシルバッファに0~255の値をオプションで書き込みます。(プロジェクト設定または r.CustomDepth == 3 が必要) */
	UPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadOnly, Category=Rendering,  meta=(UIMin = "0", UIMax = "255", editcondition = "bRenderCustomDepth", DisplayName = "CustomDepth Stencil Value"))
	int32 CustomDepthStencilValue;

	/** Sets the bRenderCustomDepth property and marks the render state dirty. */
	UFUNCTION(BlueprintCallable, Category="Rendering")
	void SetRenderCustomDepth(bool bValue);

	/** CustomDepth ステンシル値 (0 ~ 255) を設定し、レンダリング ステートをダーティとしてマークします。 */
	UFUNCTION(BlueprintCallable, Category = "Rendering", meta=(UIMin = "0", UIMax = "255"))
	void SetCustomDepthStencilValue(int32 Value);

	/** CustomDepth ステンシル書き込みマスクを設定し、レンダリング ステートをダーティとしてマークします。 */
	UFUNCTION(BlueprintCallable, Category = "Rendering")
	void SetCustomDepthStencilWriteMask(ERendererStencilMask WriteMaskBit);

	/** bRenderInMainPass プロパティを設定し、レンダリング ステートをダーティとしてマークします。 */
	UFUNCTION(BlueprintCallable, Category = "Rendering")
	void SetRenderInMainPass(bool bValue);

};

まとめ

ステンシルを使うと処理負荷が高くなるらしいので要注意です。

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?