こんにちは。
今回は作成したのはMayaでシェーダーを記述するコードを作成したものを紹介します。
スクリプト概要
機能
- ワールド座標に基づいたグリッド模様の生成を行うArnold用OSLシェーダー。
用途
- 実寸に基づいたタイル状のテクスチャの作成
- 既存のテクスチャへのタイル目地の追加
- グリッド形状のマスクの作成 等。
OSL Shader について
設定の前に、まずOSL及びaiOslShaderというものの説明をしておきます。
OSLシェーダーはOpen Shading Language (Wikipediaに飛びます)という規格で書かれたシェーダーのことで、独自の処理を定義することでシェーダーや、プロシージャルなテクスチャを作成できます。導入方法を示します。
-
aiOslShaderを作成
ノード一覧からArnold > Shader > aiOslShader を選択 -
OSLファイルをインポート
コードを入れるための広いウィンドウ[OSL Code]セクションがあるので、そこにコードを貼り付け・またはOSLファイルをインポート - Compileボタンを押す
これでコンパイルが成功すれば、入出力のポートが使用できるようになり、内部でもコードの内容を用いて計算されるようになります。 エラー発生時はスクリプトエディターに表示されるログを確認します。
※aiOslShaderはコンパイル直後はArnoldレンダービューに反映されないことがあります。そのときは一度レンダービューのウィンドウを閉じるか、Arnoldレンダービューメニュー Render > Update Full Scene を行う必要があります。
今回はこのOSLシェーダーを用いて独自のプロシージャルテクスチャを作成した例を紹介します。
操作
動画
シェーダーのアトリビュートを操作してタイルテクスチャを合成しています。
以下の特長があります。
- 実寸で・自由にタイルの大きさを決められる
- あらゆるテクスチャをタイルにできる
- ワールドXZ座標に基づく投影のため、トポロジーやコンポーネント座標の変化の影響を受けない
シェーディングネットワーク図
動画で使用したシェーディングネットワークの概観です。(クリックで拡大)
使用しているOSLシェーダーは
- 「MaskAndOffsetWorldXZ」
- 「TextureCombiner」
の2つです。これらのノードが
- 「タイルの大きさや幅の太さ等タイルの形状を設定」
- 「タイル別 + タイル内にランダムな色の変化をつける」
- 「Color、Height、Roughnessをそれぞれ合成し、テクスチャとして出力」
といった一連の処理を行います。
操作手順
- Hypershadeでシェーディングネットワークを構築またはマテリアルをインポート(mbファイルを使用)
- MaskAndOffsetWorldXZノード(OSL)を設定
タイルの寸法・回転といった形状設定からマスク・オフセットを出力 - TextureCombinerノード(OSL)を設定
入力されたテクスチャ・マスクの情報からColor、Height、Roughnessマップをそれぞれ合成し出力 - Arnoldレンダービューで確認
MaskAndOffsetWorldXZノード
まず一つ目のOSLノードです。
入力
ここでは、以下のタイルの寸法やオフセットのスケールといった形状に関する項目を設定します。
- タイル幅
- 目地の幅
- ブラー (タイルと目地の境界、Heightマップにおける傾斜に相当)
- テクスチャオフセットに用いる 乱数のスケール (ランダム変化のスケーリング、0のときはオフセットなし)
- Rotate (模様を回転させる)
- Offset (模様を移動させる)
出力
出力するのは、
- Line Mask :タイル部分と目地部分を分けるマスク
- Random Value :タイルごとの色の違いを作成するためのランダム値
- Texture Offset :タイル別のテクスチャのオフセットに用いるベクトル
といったものです。これらの値を他のノードに接続します。(接続先については先程載せたシェーディングネットワークを参照のこと)
TextureCombinerノード
続いて、2つ目のOSLノードです。
入力
入力できる項目は
- Random Color :ランダム値を用いた乗算に用いるカラー
- Random Noise :乗算用ノイズテクスチャ
- タイル部分のテクスチャ (カラー・ラフネス・Height)
- 目地部分のテクスチャ (カラー・ラフネス・Height)
といった、テクスチャ・マスクに関する情報です。これらを合成して最終的なテクスチャとして出力します。
出力
入力した値は、
- Color Out
- Height Out
- Roughness Out
として出力されます。これらをシェーディングエンジンに接続される最終的なシェーダーノードに適宜接続することで、結果が反映されることになります。
Metalness・Opacityといった項目は入れていませんが、必要であれば、Roughnessの計算で用いているコードをそのままコピーし、変数の名前を変えればすぐに実装は可能です。(タイル・目地それぞれに一定の値を適用するので十分であれば、一つ目のOSLシェーダーから出力した Line Mask のColorをaiRamp系統で調節して接続すれば事足ります。)
Random Color については、この2つのカラーのRGB値を Random Value: タイルごとのランダム値 を用いてリニア補間しタイル部分に乗算することで、タイルにランダムな色のばらつきを与える仕様です。(そのため1色目は乗算しても変化しない白:RGB(1, 1, 1)がデフォルトです。)
リニアでなく例えばガウス分布などに近づけたい場合は乱数生成時もしくは合成時の数式の変更が必要になります。
追加説明
このネットワークはワールドXZ軸の座標を用いてタイルの模様を作成するもので、言い換えれば「床・地面専用」です。利点としては、フェース範囲を増やそうがオブジェクトに回転を加えようが模様がほとんど影響を受けません。
壁や曲面に対して使用したい場合は、別に作成した、UV座標を使用するバージョンを使用する必要があります。
おわりに
設定項目は多く煩雑ではあるかもしれませんが、その分自由なテクスチャを使用でき、ランダム値・ノイズを加えることで自然なタイルを作成できる優れもののツールになったかと思います。
UV版もあるのでぜひご覧ください:(次回)
当スクリプトの配布・販売予定については未定(調整中)です。
続報をお待ちください。



