見出し画像

Stochastic Tri-Planar

今回紹介するStochastic Tri-Planarとは、一つのTexture SampleでTri-Planner Mappingを行う手法です。

以下の動画とCGWorldのFORSPOKENの記事、Omoriさんのツイートによって助けられました。動画ではStochastic Tri-Planarの他に、複数の画像を一つのTexture Sampleでマッピングする手法も解説してますので、ぜひご覧ください。

https://cgworld.jp/article/202302-forspoken-e.html

通常のTri-Planner Mapping

Unreal Engine には World Aligned Texture というマテリアルファンクションが用意されており、Texture Objectを接続するだけで簡単にTri-Planner mappingが行えます。

マテリアルファンクションによって複雑な処理を理解しなくても使うことができる

この World Aligned Texture ですが、おおよそ下の画像のような仕組みになっています。実際のマテリアルファンクションはもう少し複雑ですが、説明のために少し機能を省き簡略化しました。

Tri-Planner mapping の仕組み

この手法の欠点は、3方向からマッピングを行い合成しているので、Texture Sampling を3回使用していることです。PBRのマテリアルで使用する場合はBaseColorだけでなく、Normalと、Packしたデータも使用するため、これだけで9回のTexture Samplingを使ってしまいます。
Texture Samplingはマテリアルの中でも描画不可が大きいので、できれば使いたくない方法です。

UVの時点で視点をブレンドして、サンプリングを一回で行う

そこで考えられるのが、UVを生成したあとの画像を合成するのではなく、UVの時点でいい感じに複数の視点を合成して、そのUVで一回だけマッピングする方法です。しかしUVの合成というのは画像のように単純にLarpで合成する事ができません。
ぼくも数年前から何度か試してみたのですが、UVをうまくブレンドできず使えるものにはなりませんでした。

昔にやって失敗した例のひとつ
結合部のUVがねじれているのが目立つ

ディザテンポラルAAを用いたUVのブレンド

この手法では視点の切り替わるマスクにディザテンポラルAAでノイズをかけることでUV同士のブレンドを自然に行っています。

Alexさんの手法。ディザテンポラルAAで合成している
マッピング領域のマスク
X方向のマスク

また、Texture Sampler の設定は、Derivative (explicit derivative to compute mip level)にしている。DDX、DDYは隣り合ったピクセルまでの長さを調べる値で、ミップマップに関連するパラメーターです。
殆どの場合は、あえて設定する必要はないのですが、今回のようなワールド空間から生成したUVの場合、壊れてしまっているので、適当なUVから作っておく必要があります。

※ このあたりのことは自分も詳しくないので間違いがあれば教えてください

Texture Sampler を Derivative に設定

ひとつの Texture Sampler で Tri-Planner を実現できた。
軽量化に役立ちそう。

つなぎ目はほとんど目立たない


この記事が気に入ったらサポートをしてみませんか?