【Unity】Shader Graphを使って「テクスチャが伸びる問題」を解決する

テクスチャが伸びないシェーダーを作ろう! ゲーム開発

今回はシェーダーに関する話で、

どんなスケールのゲームオブジェクトでもテクスチャが伸びないシェーダーの作り方

をご紹介するという内容です。

Unityでゲームを作っていると、スケールを変更したゲームオブジェクトにテクスチャを貼りつけた時、テクスチャが伸びてしまう問題が発生することがあります。見栄えが悪くなるのでさっさと直したいところですが、解決策がよく分からず悩んでしまう方も多いのではないでしょうか。

そこでここではShader Graphを使ってテクスチャが伸びないシェーダーを作る方法を解説していきますね。


※なおShader Graphって何?という方は下記の記事も併せてご覧ください。

【Unity】Shader Graphが楽しすぎる!基本的な使い方を紹介
今回はUnityのShader Graphの使い方を解説する記事です。 私はしばらく前までシェーダーについて 作り方がよく分からん 自作できれば表現の幅が広がりそうだけどなんか大変そうだ などと思っていました。 しかし最近URPのプロジェク...

そもそも、Unityでよくある「テクスチャが伸びる問題」とは?

まずはじめに「テクスチャが伸びる問題って何だよ」と思う方もいらっしゃるかもしれないので、この問題について簡単に説明しておきます。

例えばX軸方向に伸ばしたキューブに、下の画像のように縦横比がそのままの状態でテクスチャを貼りつけたいのですが…

テクスチャが伸びる問題とは(1)

こうしたいのに…

標準のシェーダーだと下のようにテクスチャが伸びてしまいます。

テクスチャが伸びる問題とは(2)

こうなってしまう!

これが「テクスチャが伸びる問題」というわけです。Unityでゲームを作っているとゲームオブジェクトを不均一にスケーリングすること(つまり、例えばX方向のスケールだけを大きくするとか)がよくあるので、これは頻繁に遭遇する問題です。

Shader Graphでテクスチャが伸びないシェーダーを作ってみよう

ではここからが本題ですが、その問題の解決策としてShader Graphを使ってテクスチャが伸びないシェーダーを実際に作ってみましょう。お手本のノードの組み方は次の通りです。

テクスチャが伸びないシェーダーの例

このシェーダーの主なポイントとしては次のようなものがあります。

  • Triplanarノードを使う
  • Positionを「Absolute World」にする

Triplanarノードを使う

まず一つ目のポイントは「Triplanarノード」を使うことです。

Triplanarノード

Shader Graphのマニュアル(機械翻訳)によると、Triplanarとは次のような投影方法だそうです。

Triplanarは、世界空間に投影することにより、UVを生成し、テクスチャをサンプリングする方法です。入力テクスチャは、ワールドのx軸、y軸、z軸のそれぞれで1回ずつ、3回サンプリングされ、結果の情報はモデルに平面投影され、法線角度または表面角度でブレンドされます。

つまり、これによって3DモデルのUVにかかわらず均等にテクスチャを貼りつけられるというわけです。使いこなせると非常に便利なノードなので、知らなかったという方はぜひ覚えておいてください。

Positionを「Absolute World」にする

次に二つ目のポイントはPositionを「Absolute World」にすることです。

Positionノード

これを先ほどのTriplanarノードのPositionスロットにつなぐことで、ゲームオブジェクトの位置・スケール・回転に依存しないようにテクスチャを貼りつけることができます。

ちなみにPositionノードには「World」というオプションもありますが、両者の違いは

The Absolute World option always returns the absolute world position of the object in the Scene for all Scriptable Render Pipelines. The World option returns the default world space of the selected Scriptable Render Pipeline.

だそうです。つまりWorldだとレンダーパイプラインによって違う結果になってしまうので、今回の場合はAbsolute Worldを選択しておけばよいというわけですね。

おわりに

以上、簡単ではありますがShader Graphを使った「テクスチャが伸びないシェーダー」の作り方をご紹介しました。

Unityでテクスチャが伸びてしまい困っている、という方はぜひ今回の方法を試してみて頂ければと思います。