visionOS Reality Composer Pro でのShaderGraph
visionOSのReality Composer ProにはShaderGraphの機能が備わっておりノードベースでシェーダーを作成することができます。
今回は公式の Explore materials in Reality Composer Pro の動画をもとにShaderGraphの使い方をまとめました。
導入
今回の説明では Diorama
のサンプルコードをもとに説明をしています。
Diorama
のサンプルコードはこちらからダウロードできるのでダウンロードしてください。
Diorama
また Xcodeのバージョンは Xcode15 bata6 で試しています。
環境構築
Diorama
のプロジェクトを開いたらReality Composer Proを開きます。
Packages/Package
を選択して Open Reality Composer Pro
のボタンを押すと開くことができます。
今回のテストように新しいシーンを作成しましょう。
Project Browser
の左上にある立方体のアイコンを選択すると新しいシーンが作成できます。
シーンを作成したら TestScene
と名前を変更して開きましょう。
次に マテリアルを適応するためのモデルをシーンに追加します。
シーンに Yosemite
と Diorama_Base
を ドラッグ&ドロップ
して追加をしましょう。
等高線シェーダーの作成
Reality Composer Proを開いたら 左下の +
ボタンを選択して Material/Custom
でカスタムマテリアルを作成します。
作成したマテリアルの名前は TopographyMaterial
に変更してマテリアルをオブジェクトにバインドします。
オブジェクトを選択して Material Bindings
から作成したマテリアルを選択します。
適応するとグレーのカラーのマテリアルが適応されます。
これはデフォルトのカラー設定がグレーになっているためそうなっています。
ShaderGraph
を開いて確認してみましょう。
作成したマテリアル選択し、下部の ShaderGraph
を選択するとシェーダグラフを開くことができます。
MaterialXPreviewSurface
を選択すると Inputs
の Diffuse Color
がグレーになっているのが確認できます。
高線を追加するためにノードを追加してみましょう。
Shader Graph
のウィンドウの中で ダブルクリック
を行うと、ノードの検索が表示されます。
Position
と入力を行い 位置を取得できるようにします。
Position
ノードでは どの空間でのポジションを取得するかが選択できます。
今回はオブジェクト空間での位置を元に等高線を表示します。
等高線ではY座標のみを使用するため Y座標を抜き出す必要があります。
Separate 3
ノードを追加して Position
を XYZ
に分割します。
次に Y座標を一定間隔に分割するため Modulo
ノードを追加します。
Modulo
ノードでは 割り算を行ったあまりの数値を取得することができます。
%
を選択すると Inputs
の In 2
に割る数の設定を行います。
今回は 0.1
として 0.1
間隔になるようにします。
これだと 一定間隔 をシームレスに繰り返すのみになっているため、線として表示するため ある一定上の数値のみ取得できるようにします。
If Greater
が value1 > value2
の処理を行うことができるので追加を行います。
If geater
には Type
があり 出力するフォーマットを変更することができます。
今回は入力結果をカラーとして使用するため If Geater (color3f)
を選択します。
If greater
の Inputs
の Value1
には Y
を Modulo
した値を入れています。
Value 2
の数値以上の時に True Result
を返して 違う場合には False Result
が出力されるようになっています。
今回は 0.002
として設定して 0~0.002
までを黒くして線の表示に使用しています。
if geater
の出力を Diffuse Color
に繋げると モデルに反映されるようになります。
繋げてみると 0.1
間隔で等高線が引かれた状態になるかと思います。
等高線シェーダーの関数化
次に等高線の間にもう一つ 薄い線で細かい線を区切ります。
機能ごとノードをまとめて使うことができるのでまとめて関数化して使いまわしましょう。
まとめたいノードを選択して、 Compose Node Graph
を選択するとノードをまとめられます。
まとめたグラフの名前部分をクリックすると名前が変更できるので Lines とわかりやすいように変更しておきます。
次に関数を使いやすいように Space
と Color
を入力できるようにして、線の間隔と色を指定できるようにします。
Inputs
の New Input
ボタンを押すと入力パラメータを追加することができます。
Space
を Float
で Color
を Color3 (Float)
で追加を行います。
Space
を Modulo
の Value 2
に, Color
を False Result
に入れて外から設定できるようにします。
まとめたノードを選択すると Inputs に追加したパラメータを設定できるようになっています。
細かい等高線を追加するために Lines
をコピーして増やします。
Line_1
の方を選択して Color
をグレーに Space
を 0.02
に変更します。
2つの線を両方重ねる必要があるため Multiply
で2つの線の出力を掛け合わせます。
すると濃い線と薄い線が交互に表示されるようになりました。
Space
を変更することで線の間隔を調整することができます。
Geometry Modifier
Geometry Modifier
を使用することでシェーダーグラフの方で頂点の変更も行うことができます。
今回はフラットなモデルにHightMapを適用しモデルを変形させていきます。
まず、Yosemite
のモデルは使用しないため Deactive
をして非表示にしておきます。
次にマテリアルを適応する FlatTerrain
を追加します。
適応するマテリアルを DynamicTerreinMaterial
として作成します。
作成したマテリアルを FlatTerrain
に適応します。
まずはTextureを読み込んでモデルに適応していきます。
Image
ノードを作成してDiffuseColor
に接続します。
Image
ノードを見てみるとInputs
にFilename
がありそこからテクスチャを指定することができます。
DioramaYosemite_bc.png
を選択してテクスチャを設定します。
これでモデルにテクスチャが貼られました。
次にシェーダーグラフを開いて Geometry Modifier
を追加します。
Output
の Custom Geometry Modifier
の接続部分を引っ張るとそこに接続できるノードのみが選択できるので便利です。
GeometryModifer
を見てみるとこのような要素が存在します。
注意点としては Model Position Offset
となっているため入力に使用する頂点位置は 元のモデルからの差分として入力を行います。
次にHeightMap
のテクスチャを読み込みます。
Image
ノードを追加し今度はDioramaYosemite_refit_h.exr
を読み込みます。
読み込んだテクスチャを Y
として使用したいためConbine3
ノードを作成します。
Combine3
のY
にHeightMap
の出力を追加して、それを Model Position Offset
に設定します。
するとテクスチャの明るくなっている部分の頂点が盛り上がって表示されているのが確認できます
次にNormalMap
のテクスチャを読み込みます。
新しくImage
を作成してDioramaYosemite_n.png
を読み込みます。
Normal
として使用するため Type
の設定をVector3f
に変更します。
現状のNormalMap
は0〜1
になっていますが-1〜1
として使用したいためRemap
を行います。
Remap
を追加したら1要素の選択で良いように Type
をVector3f FA
に変更します。
FA
の付くタイプに変更すると1つの要素の変更で全て同じ値が入るようになります。
今度はこのような形でCatalina
の山をブレンドして2つの形状に変形できるように対応してみます。
前回作成したものと同じように、DioramaCatalina
のDiffuse
,Normal
,HeightMap
用のテクスチャを読み込みます。
次にMix
ノードを追加してそれぞれのテクスチャを混ぜ合わせます。
Constant
というパラメータを追加して Mix
ノードのMix
を同じように変更できるようにします。
これでConstant
の値を変更するとシームレスにYosemite
からCatalina
に変更できるようになりました!
まとめ
ShaderGraphを使用することで簡単にシェーダーを作成することができました。
型を自動的に合わせてくれなかったりと、細かい点は使いにくいところもありますが、機能としてはよくあるノードベースのShaderGraphとあまり変わらず使用することができたと思います。
書いた人
佐藤 寿樹
株式会社コナミデジタルエンタテインメントに入社し5年間ウイニングイレブンのオンライン実装に携わる。
その後、株式会社コロプラで9年間エンジニアとしてアプリ開発・運用を行い、位置情報やARを使用したARゲーム開発、OculusRiftやPSVRなどのVRゲーム開発を経験しMESONへ入社。
MESON Works
MESONの制作実績一覧もあります。ご興味ある方はぜひ見てみてください。
Discussion