こんにちは、Steemです。
サイト作るって大変ですね。
皆さんはご機嫌いかがお過ごしでしょうか。
作成したのはシェーダーを記述するコードです。
動画
いかがでしょうか。テクスチャにUIでの操作性が加わっていることはご覧いただけたかと思います。
それでは、機能と操作について説明します。
機能説明
まずここで紹介するのは、これまでに紹介してきたメッシュオブジェクトを扱うスクリプトとは異なり、テクスチャとしてタイルを生成する一連のシェーディングネットワークです。
今回紹介するツールの特長は3点です。
- 実寸で・自由にタイルの大きさを決められる
- あらゆるテクスチャをタイルにできる
- ワールドXZ座標に基づく投影のため、トポロジーやコンポーネント座標の変化の影響を受けない
これらまとめて "gridTextureMaker" と呼ぶことにしていますが、この中に aiOslShader を用いたオリジナルのシェーダーを含めています。
作成したOSL Shaderは
- "MaskAndOffsetWorldXZ"
- "TextureCombiner"
こちらの2つに分かれています。
これら2つのノードが
- 「タイルの大きさや幅の太さ等タイルの形状を設定」
- 「タイル別 + タイル内にランダムな色の変化をつける」
- 「Color、Height、Roughnessをそれぞれ合成し、テクスチャとして出力」
といった一連の処理を行います。
こちらが動画で使用したシェーディングネットワークの概観です。(クリックで拡大)
OSL Shader について
設定の前に、まずOSL及びaiOslShaderというものの説明をしておきます。
OSLシェーダーはOpen Shading Language (Wikipediaに飛びます)という規格で書かれたシェーダーのことで、独自の処理を定義することでシェーダーや、プロシージャルなテクスチャを作成できます。
※aiOslShader は Arnold レンダリングのみに対応しており、Maya標準レンダラーでは使用できません。
※また、こちらはCPUレンダリングでの使用に最適化されており、GPUでのレンダリングにはっきりと向かない処理もある模様です。(この記事で紹介するものについてはGPUレンダリングで使用できます。)詳しくは別のソースを参照してください。
導入は簡単で、以下の手順で有効化します。
- aiOslShaderを作成
- ノード一覧からArnold > Shader > aiOslShader を選択
- OSLファイルをインポート
- コードを入れるための広いウィンドウ[OSL Code]セクションがあるので、そこにコードを貼り付け・またはOSLファイルをインポート
- 最後にCompileを押す
- これでコンパイルが成功すれば、入出力のポートが使用できるようになり、内部でもコードの内容を用いて計算されるようになります。 エラー発生時はスクリプトエディターに表示されるログを確認しましょう。
なお、aiOslShaderはコンパイル直後はArnoldレンダービューに反映されないことがあるので、結果がおかしいと思ったら一度ウィンドウを閉じるか、Arnoldレンダービュー上のメニュー内 Render > Update Full Scene などの操作が必要です。
MaskAndOffsetWorldXZノード
まず一つ目のOSLノードです。
入力
こちらで設定できるのは、タイルの寸法やオフセットのスケールといった形状に関する項目です。 具体的には、
- タイル幅 (中心間の間隔)
- 目地の幅
- ブラー (タイルと目地の境界、Heightマップにおける傾斜に相当)
- テクスチャオフセットに用いる乱数のスケール (0~1の乱数にこの値を乗算、0のときはオフセットなし)
- Rotate (模様を移動させる)
- Offset (模様を回転させる)
といった項目です。
出力
出力には、
- Line Mask:タイル部分と目地部分を分ける
- Random Value:タイルごとの色の違いを作成
- Texture Offset:タイルひとつひとつのテクスチャのオフセットに用いるベクトル
といったものがあります。これらの値を適切な箇所に接続し、次のノードに処理を受け渡します。(接続先については先程載せたシェーディングネットワークを参照のこと)
TextureCombinerノード
続いて、2つ目のOSLノードです。
入力
入力できる項目は
- Random Color:ランダム値を用いた乗算に用いるカラー
- Random Noise:乗算用ノイズテクスチャ
- タイル部分のテクスチャ (カラー・ラフネス・Height)
- 目地部分のテクスチャ (カラー・ラフネス・Height)
といった、テクスチャ・マスクに関する情報です。これらを合成して最終的なテクスチャとして出力します。
なお、Metalness・Opacityの項目は入れていません。
もし拡張が必要であれば、Roughnessの計算でで用いているコードをそのままコピーし、変数の名前を変えればすぐに実装はできると思います。
(またタイル・目地それぞれにひとつの値を適用するので十分であれば、一つ目のOSLシェーダーから出力した Line Mask のカラーをaiRamp系統で調節して接続すれば事足ります。)
Random Color については、この2つのカラーのRGB値を Random Value: タイルごとのランダム値 を用いてリニア補間しタイル部分に乗算することで、タイルにランダムな色のばらつきを与えます。(そのため1色目は白:RGB(1, 1, 1)が推奨です。)
リニアでなく例えばガウス分布などに近づけたい場合は乱数生成時もしくは合成時の数式の変更が必要です。
出力
入力した値は、
- Color Out
- Height Out
- Roughness Out
として出力されます。これらをシェーディングエンジンに接続される最終的なシェーダーノードに適宜接続することで、結果が反映されることになります。
追加説明
なおこちら、ワールドXZ軸の座標を用いてタイルの模様を作成するもので、言い換えれば「床・地面専用」です。利点としては、フェース範囲を増やそうがオブジェクトに回転を加えようが模様がほとんど影響を受けません。
壁や曲面に対して使用したい場合は、別に作成した、(一般的なテクスチャと同じように)UV座標を使用するバージョンを使うのが良いかと思います。(壁であると、ワールド座標の値を使えたとしても投影の向きの制御が面倒かと思います)
(UV版は次回紹介:こちら
)
非常に長くなりましたが、作成部分についての解説は以上になります。
おわりに
設定項目は多く煩雑ではあるかもしれませんが、その分自由なテクスチャを使用し、ノイズも加えて、自然なタイルを作成できる優れもののツールになったかと思います。
テクスチャ画像を簡単に作ることのできる時代ではありますが…リピート感をなくすには、シェーディングネットワークを使ったこうした技を使うのが良いかもしれません。
UV版もあるのでぜひご覧ください:(次回)
=================
こちらのスクリプトを無料配布しています↓
ダウンロードページはこちら
(2025.12.28更新)
=================
お問い合わせはこちらまでお願いします。



