Search Unity

Unity の確率論的プロシージャル・テクスチャー生成

, 2月 14, 2019

大きなサーフェスを覆ったり、細かなディテールをメッシュに追加する際に、タイル化されたテクスチャーを使ってみたことはあるでしょうか?使ったことがある方なら、タイリングの値を高くした途端に反復パターンが目立ってしまう現象をご存知でしょう。Unity Labs では、この問題を回避する新しいテクスチャリング技術「確率論的プロシージャル・テクスチャー生成」を開発しました。

タイル化されたテクスチャーは、3D シーンにディテールを追加するのに便利なツールです。しかし、これと詳細マップを併用して大きな領域のテクスチャリングを行ったり、非常に詳細なサーフェスを作ろうとすると、タイリングの反復パターンがはっきり見えるようになってしまいます(下の左側の画像をご覧ください)。一般的には、こういった反復パターンを分かりにくくするには、より大きなテクスチャーを使用するか、追加的なオブジェクトでパターンを隠す必要があります。本記事では、錆、苔、樹皮などのランダムな(確率論的な)見た目を持つテクスチャ―用に、この問題を解決するプラグインを提供します。このプラグインを使用すると下の右側の画像のような結果を得られます。

【錆ついた金属マテリアルの例】左側は通常のテクスチャリング、右側は上述の技術を使用

プラグインのダウンロードはこちらで行えます。

本プラグインは、特定の入力に対して、その入力の見た目に合う無限テクスチャーをプロシージャル生成します。これは、最先端のテクスチャーブレンディング機能(入力テクスチャーに修正を加えたバージョンを扱い、フラグメント毎にテクスチャ―サンプルを 3 つだけ必要とする)を使用して、小さなルックアップテーブルをフェッチすることで行われます。本プラグインはタイリングの必要性を回避するので、反復のパターンを目立たせることなく、小さなテクスチャーを使って高い詳細度で大きなサーフェスを覆うことが可能となります。

StandardStochastic シェーダーを使用する

本プラグインは、Unity パッケージに含まれる Standard シェーダーのバリアントを提供します。パッケージをインポートした後で、マテリアルに StandardStochastic シェーダーを選択してください。インターフェースは基本的に Standard シェーダーと同じですが、上に制御できる項目が 2 つ追加されています。これらは 2 つの必要設定手順に対応するものです。

 

  1. Stochastic Inputs メニューでは、どの入力テクスチャーに対してこの新しいテクスチャリング技術を有効にするかを指定できます。すべてのテクスチャー(「Everything」)、あるいは特定のテクスチャー([例]アルベド、法線マップなど)に設定可能です。
  2. Apply ボタンを押すと、Stochastic Inputs で選択した入力テクスチャ―に対してデータの事前計算が行われ、マテリアルが更新されて処理が完了します。このステップによって、入力テクスチャー毎に 2 つの中間テクスチャ―が同じフォルダー内に生成されます。

追記事項

  • 生成時間を省略するために、既存の中間テクスチャーが検知されるとそれらが読み込まれます。したがって、元々のテクスチャーに何らかの変更を加えた場は、Apply ボタンを押す前に、中間テクスチャーを(強制的に再生成するために)両方とも削除する必要があります 。
  • Standard シェーダーと StandardStochastic シェーダーとの間で切り替えを行う場合、パラメーターは相互に伝達されます。
  • Specular ワークフローを使用したマテリアル用に StandardStochastic(Specular setup)シェーダーも提供されています。

以下の画像は、本プラグイン(プロトタイプ版)で、小さな(256²)入力テクスチャーを使用して各種マテリアルの処理を行った例です。

アルベド・法線・オクルージョンテクスチャーを使用した木材の詳細マップ

 

アルベド・法線・オクルージョン・ハイトテクスチャーを使用した石材のマテリアル

 

アルベド・法線・Metallic/Smoothness テクスチャーを使用した鉄のマテリアル

制限事項

この技術の使用が適しているのは、タイル化可能な、確率論的テクスチャーまたは「ほぼ」確率論的なテクスチャーのみです。つまり、遠くから見たランダムなノイズのようなテクスチャーや、自然界に典型的に見られるような、厳密な形状のないマテリアルに適しています。

フィードバック

本プラグインは研究用のプロトタイプであり、正式に本格的な開発が進められているものではありません。したがって継続的な運営やサポートは保証されていませんが、ご質問やフィードバックはUnity フォーラムのこちらのスレッドへお気軽にご投稿ください。Unity では現在、シェーダーグラフのカスタムシェーダー用の実装および新しいレンダーパイプラインとの互換性の構築に取り組んでいます。最新の情報は、フォーラムのスレッドをぜひチェックしてください!

参考資料

本プラグインの仕組みを詳しくお知りになりたい方は、Unity から最近公開された 2 つの研究論文をお読みください。本プラグインの基盤となる技術についてご紹介しています。

本プラグインに含まれるコードには、上記の「技術記事」の特定の箇所を参照したコメントが記載されています。

35 replies on “Unity の確率論的プロシージャル・テクスチャー生成”

For everyone asking about terrain, I shipped a variation on this technique in MicroSplat’s Texture Cluster module this morning. It replaces the Histogram Preserving operator in the paper with a height blend, which removes the need for preprocessing the textures into custom formats, generating lookup tables, etc.. Results are also posted in the forum thread.

Absolutely love this, as I was searching for a tech like this just a couple of days ago. Will go directly into a new project… Thumbs up!

I love this kind of stuff:)

Unity 2017 compatibility would be nice, but i understand if it’s not possible.

Nice work either way.

This tool is great and we could use for it for a big project.
There is one thing though that would make it even better : handling multiple selection.
In our case, we are procedurally generating textures in another tool and would need to apply this shader to materials with our textures.
To do that, we created a menu item that checks for textures in a folder, create materials in another one, apply this shader to the materials and set the material’s texture’s “_MainTex”.
The problem is that to trigger the “apply” function, we would have to tweak the StandardStochasticShaderGUI class ourselves since selecting more than one material at a time and clicking on “Apply” will result in the same texture being applied to all of them :/

Anything you could do about it ?

This is major! Texture repetition has never been fully solved before. Artomatix had an implementation but that is currently not available (I believe they are working on it though). Please integrate this into Unity with full support. It is too valuable to let it get moldy in just another cool but forgotten research project.

Just tested:
A long awaited dream finally comes true.
Hopfully this will be integrated in the next releases.

Very cool. This helps to solve one of the bigger issues that the standard shader has and honestly I’m all for this. Is there a chance that this shader will also come to the scriptable render pipelines as well? Or do they already have something like this?

ImageSynth was cool in 2003… so this in 2019 is a bit YAWN… UNLESS you add this; that the texture space is used for a scaleable texel ratio and for the shader to tile within that space.
THEN YOU’D HAVE SOMETHING NEW. #DURRRRRRRRRRRRRRRRRRRRR

Another great post – back to back with that Shader Graph Vertex Effect – Thanks once again!
No problems when trying it out in 2018.3.0f2

Strange, i’m using unity 2018.3.5f1 and receiving a:
Assets/Editor/StandardStochasticShaderGUI.cs(587,12): error CS1644: Feature `byref locals and returns’ cannot be used because it is not part of the C# 4.0 language specification
I wonder why?

Comments are closed.