LoginSignup
19
13

More than 3 years have passed since last update.

[UE4]半透明マテリアルで一番手前の表面だけ描画する

Last updated at Posted at 2019-05-07

画像Aを画像Bのようにします。
A:ScreenShot00000.png

B:ScreenShot00002.png

半透明の問題点

上の画像はAの方が挙動としては正しいのですが、複雑なメッシュの場合Opacityを1に近づけると描画エラーが発生します。

ScreenShot00003.png
静止画だと分かりにくいかもしれませんが、奥にあるはずの面が手前側に描画されてしまっています。
これを回避するために一番手前側にある表面だけを描画します。

方法

まず、すでに置いてあるオブジェクトをCtrl + C & Ctrl +Vで全く同じ位置にコピーします。
分かりやすいように片方の名前を変えておきましょう。

片方

オブジェクトの詳細パネル>Renderingにある、
1.Render in Main Passのチェックを外す
2.Render Custom Depth Passのチェックを入れる
2019-05-07_21h00_34.png
これでCustom Depthのみに描画されます。
こちらはDefault Materialなど不透明のマテリアルにしてください。

もう片方

Translucentマテリアルをアサインし、以下のようにノードを組んでOpacityピンに刺します。
すでに何かの処理が刺さっている場合はMultiplyでブレンドすればOKです。
2019-05-07_21h07_02.png
https://blueprintue.com/blueprint/vv4r5lg1/
こちらにもアップしてあります。

具体的に何をしているかというと、Custom Depthに描画された不透明のオブジェクトの深度と、微量にスケールした半透明のオブジェクトの深度を比較し、Custom Depthの方が奥にあれば半透明を表示、手前にあれば非表示にしています。
スケールする理由はそのまま比較するとZ Fightingのようなエラーが起きるためです。

注意点

Custom Depthに描画するということは一回分多く描画負荷がかかるということになります。
処理負荷を気にする場合は過度な使用はおすすめしません。
Depth描画する方は頂点数を抑えるなどしてもいいかもしれません。

参考リンク

こちらのフォーラムで検証されている内容を参考にしました。
https://forums.unrealengine.com/development-discussion/rendering/18285-translucent-water-material-displacement-banding-issue?45945-Translucent-Water-Material-Displacement-Banding-Issue=

19
13
1

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
19
13