水のマテリアル研究⑧ 数字やテクスチャの調整はマテリアルインスタンスを作ると速い
「昨日のやつで、ノーマルマップがどんなのでも波に見えるんじゃないか? という疑問があったので、ちょっと試してみた。その結果、ただの十字状ノーマルマップだと水には見えないというのがわかった」
妹「そりゃあそうなるでしょう……」
「で、こういうのを試すのには、マテリアルインスタンスを作ってからやるのがいい。最初のうちは元のマテリアルを直接改造してたんだけど、これをやると毎回シェーダーコンパイルで待たされています。でもマテリアルインスタンスを操作するとコンパイルが発生しない」
妹「マテリアルインスタンスっていうのは、結局なんなんだろう?」
「クラスでいうとサブクラスに近い。元は同じマテリアルから作られてるけどそれぞれパラメータが違ってる。ただノードは一切いじれない。元のマテリアルでパラメータとして設定した部分だけ書き換えできる。マテリアルインスタンスのインスタンスも作れる」
妹「パラメータだったら変えてもコンパイルしなくていいの?」
「いいみたい。例えばメタリックに0.8のノードをつなぐ、としてコンパイルすると、それを0.7のノードに変えるとまたコンパイルが必要になる。でもメタリックにはパラメータノードを接続、初期値は0.8……ってやっとくと、そのマテリアルインスタンスでパラメータが変えるとすぐ画面に反映される。そういう感じにコンパイルしてくれるみたい」
妹「不思議ですなあ……」
「シェーダーコンパイルが困るのは、もちろん時間もかかるんだけど、それより切り替わる時に一瞬灰色とかのダミー映像になっちゃうのが厄介。変更する前と後の違いを見たい時に、途中で違うのが混ざると間違い探しの難易度が上がるから」
「テクスチャをパラメータにしたい時は、TextureObjectじゃなく、TextureObjectParameterを使えばいい。数字とかは右クリックしてパラメータに変換ってやればいける」
妹「あ、でもどっちのノードをつなぐか切り替えたい時とかは困るのでは? ブランチノードとかあるのかな?」
「それは見あたらなかった。もっといい方法あるかもしれないけど、とりあえずLerpに2本繋いでおいて、Alphaをパラメータにすれば、0か1かで切り替えは出来るよ」
妹「Lerpにそんな使い方が……」
「円形のノーマルマップと、線をたくさんふやしたやつ。これも近くで見ると模様まるわかりでいまいちなんだけど、遠くから見るとゴチャゴチャってなるから、水面に見えなくもなかった。でもやっぱり基本的にはランダムな感じのテクスチャがよさそう」
「岩肌のテクスチャとかでも波っぽくなる。でも微妙に感じが違うし、もう少し1枚のテクスチャでカバーする範囲を大きくした方が波に個性が出そう」