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 コメント

コメントの配信登録

コメント受付を終了しました。

  1. have an unlit version?

  2. Jason Booth

    2月 18, 2019 4:16 pm

    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.

  3. 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!

  4. Seyed Morteza Kamali

    2月 16, 2019 6:31 am

    Super Cool!!!

    1. that is quite expensive for a simple shader: 0.035 vs 0.2 ms.

      1. Which is dramatically faster than alternatives that offer similar results.

  5. I love this kind of stuff:)

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

    Nice work either way.

  6. Very nice!
    Any notes on GPU cost vs simple tiled texture?
    Mobile use realistic?

    1. Thomas Deliot

      2月 15, 2019 3:33 pm

      We have some performance comparisons on page 20 of the technical chapter:
      https://drive.google.com/file/d/1QecekuuyWgw68HU9tg6ENfrCTCVIjm6l/view
      It is on average 4-5 times slower than simple tiling. Although you can trade performance for memory by using smaller textures than you would normally need to avoid repetition patterns (all of the renders in this post are with 256² textures), which could be a win for some mobile projects.

  7. Please add this option to terrain in hdrp, or give us terrain node into shadergraph

  8. 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 ?

  9. 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.

    1. Thomas Deliot

      2月 15, 2019 10:50 am

      Thanks for the feedback ! We are planning on doing a proper release in ShaderGraph as a texture sampler node, making it available for most users in the new render pipelines.

      1. That would be awesome! Any ETA on this?

  10. Emil Dahlberg

    2月 15, 2019 9:56 am

    Hey! Any plans to support this in the lightweight or high-def pipelines?

    1. Thomas Deliot

      2月 15, 2019 10:49 am

      We are planning on implementing it as a ShaderGraph node, which would make it usable with the new render pipelines in custom shaders.

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

  12. 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?

  13. veteran person guy dude

    2月 15, 2019 3:00 am

    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

    1. Do it yourself.

  14. 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

  15. 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?

    1. What version of .NET are you using? You can check in the player settings. It should be 4.x.

      1. Thomas Deliot

        2月 15, 2019 9:38 am

        Thanks for noticing that, the .Net 4 requirement is unnecessary and slipped in, will fix it!

      2. CoolioNotTheRapper

        2月 15, 2019 10:57 am

        I’ve set it up as Net 4.x and the problem persists. Using Unity 2018.2.20f1.

  16. Niklas Werner

    2月 14, 2019 8:01 pm

    Looks very promising! Can’t wait to get my hands on this!

  17. Impressive work. Will this work with Unity terrain?

    1. I have exactly the same question!

    2. William Queen

      2月 15, 2019 1:09 am

      Great question, this would be amazing on a terrain

    3. Thomas Deliot

      2月 15, 2019 9:46 am

      The technique can be used with terrain shaders, but that will require manual implementation. The main purpose of this prototype is to make the code available in C# and shaders for Unity developers to use in their own code where they need it. Although we hope to have the technique released as a new ShaderGraph node in the future, for easy integration in custom shaders.

      1. Philip Walker

        3月 1, 2019 10:51 am

        You say it works for terrain, would there be support or a workaround to have seamless neighboring terrains aswell?

  18. Matt Radford

    2月 14, 2019 7:19 pm

    AMAZING WORK! Way more efficient than Wang Tiles. Way to go guys!

  19. Awesome! One question: which Unity versions are compatible with this plugin?

    1. Thomas Deliot

      2月 14, 2019 7:28 pm

      Currently it works with the last Unity 2018 releases in the built-in render pipeline. Since the plugin plugs into parts of the Standard Shader code, and some of that has evolved since the initial release in Unity 5, it’s not working with older versions as it is.

      I will be backporting it in the coming days as separate packages for older popular versions of Unity, mainly Unity 5.6!

      1. I could kiss you.