LoginSignup
17
7

More than 1 year has passed since last update.

[UE4] Decalの延びを何とかしたい

Posted at

検証UE4: 4.27.1

はじめに

デカールはEnvironmentsのディティールアップ、また着弾爆発のようなゲームの演出としても非常に効果的です。
しかし、UVは2Dなので高さ方向のテクスチャが延びて見えてしまう傾向にあります。
image.png
ちょっと格好悪い……何とかしたい……
Decal扱う人が通る道かと思うので、どっかに良い解決策があるかもしれません。あったら教えて下さい。

参考

(タイリング用)法線方向でUVを補間する

image.png

こちらのコースティクスで実装されていました。Thanks Ben.
Water Caustics - UE4 Materials 101 - Episode 27 - Youtube

各面方向に展開したUVを、法線方向から補間して使用しています。
いい感じだと思いました。
UVで対処してテクスチャサンプリングが1つという事で、円柱辺りに少し境目が見えてしまっているでしょうか。
image.png

実装

image.png
※DBufferでは「SceneTexture:WorldNormal」が取得出来ない為、後述の代替を試してください。→DBufferでシーン法線を使いたい

(タイリング用)WorldAlignedTextureで3Dマッピング

image.png

ノードが用意されているので、一番簡単な手法です。
ワールドXY平面、YZ平面、XZ平面でそれぞれテクスチャサンプリング。後は法線方向でブレンドします。
一つ前のはUVを補間、こちらはテクスチャサンプルの結果を補間しているのが違いです。

恐らくタイリングを用いる方法では一番綺麗なのかな、と思います。
ただ、テクスチャサンプリングを3回行う都合上、描画負荷が高くなる傾向にあります。

実装

image.png
WorldAlignedTexture関数はUE4デフォルトで用意されています。
※DBufferでは「SceneTexture:WorldNormal」が取得出来ない為、後述の代替を試してください。→DBufferでシーン法線を使いたい

角度によって消す

image.png

こちらで紹介されていました。Thanks Tobias.

配置したデカールから一定角度以上の所は非表示にして、延びている所を消してしまう方法です。
実装は手軽で格好悪い所を消せるので、ひとまずこれで実装して様子見るのがいい感じがします。
僕も過去、同じような方法で対処した事あります。
デメリットとしては、段差とかで若干不自然に見えたりする事でしょうか
image.png

実装

image.png
DDX,DDYの下りは法線を取得しています。→DBufferでシーン法線を使いたい参照
その法線から一定角度をオパシティで非表示にしています。

球状に展開する

image.png
記事書きながらあれこれ考えてたらちょっとマシな感じになりました。
DecalComponentのZ軸座標から離れるほどUVを縮小してみました。
球状(というよりは三角形状)にUVをスケールしています。
実際のシーンなりで確認していないので、何かしら粗があるかもしれません。

実装

image.png
今はXY平面に配置する前提で組んでますけど、壁に撃った銃弾とかはいい感じに軸変えて計算すればいけるかも。試してないです。

ほか

DBufferでシーン法線を使いたい

WorldPositionからDDX,DDYを使うことで算出できるようです。
(ちょっと勾配関数詳しくないので間違ってたらごめんなさい)
image.png
SceneTextureを参照しないのでDBufferでも使えます
image.png

17
7
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
17
7