値が0以外の場合は前方から4byteずつ1枚目〜4枚目のテクスチャイメージ情報へのインデックスを表す。]]>ん?予約変数使っていないですね。セマンティクスアクセスです。カラーがテクスチャインデックスになります。(そんなところ節約してどうするって言いたいですが、常にいらない情報が詰まっているのが許せなかったみたい。このしくみでエフェクトにテクスチャ16枚まで設定できます。読み込みに失敗しました...調査、修正します。固定で直にイメージへ結びつけています。いう自由すぎる参照ルールには困ったところですよね。このほか、関連した不具合を修正しました。頂点レイアウトにテクスチャ座標があったときに、自動シェーダ作成機構が誤ってディフューズテクスチャ変数を作成するというものです。場合によりテクスチャなしでも、テクスチャ座標が埋め込まれることがあるのでこれは不具合です。ディフォルトでアルファブレンドできるようステート設定をするようにしました。これにより半透明なオブジェクトを表現することができるようになりました。はい、では本題に戻って後からシェーダパラメータの結びつけ機能というものを考えていきましょう。テクスチャ付きBOXを読み込むと次のシェーダを自動で作成してくれます。ここで、テクスチャファイルを別のものに置き換えたい場合について考えます。カラーfloat4をそれぞれインデックスにしているのはいただけない。ここはどうにかして、可変長のインデックス配列を継ぎ足せたら良いのだが...そこでカスタムアトリビュートの概念が出てきます。アイデアが浮かばない...あ、浮かんできました。現在シーンで使用しているイメージをリストアップします。今はこんな感じですが、修正後はこんな感じです。いまのところ、プロパティが次のとおり、何もいじれません。ファイルを指定できるように修正します。ファイルを選択後、いつものようにエフェクトを適用するとリソースを作り直して、描画結果に反映されます。エフェクト反映後↓テクスチャファイルを別のものに置き換えたい場合はプロパティタブからファイルを指定する。話が少し戻りますが、カメラの情報とライトの方向はいつ、誰が更新しているのでしょうか?答えはメインウィンドウです。3Dビューの中で中ボタンドラッグ中はそのマウス移動イベントで現在のエフェクト全てに対して予約変数の更新をかけます。これは全てのシーンにてすべてのエフェクトに対し、指定した予約IDのエフェクト変数を更新するという意味です。介入なのでメインウィンドウのイベントハンドラなどから実行する場合はロックが必要になります。話を戻して、今度は予約変数を増やします。時間とマテリアルに関する情報をシステムに指定してもらうようにします。更新のタイミングですが...それはいつか?考えていきましょう。ノード姿勢の更新なども、一旦更新しましたフラグを見るのが良いと考えます。プロパティにすべて更新しましたフラグを追加してみます。基本的に親ノードから階層構造で辿っていくので、末端までは再帰します。このとき必要になるのが、親の姿勢です。こればっかりは必要なので、親ノードの姿勢というものがどこに格納されているのか見ます。変数更新処理をノードの更新ありき、なければ以前の情報を参照する。いう処理に変えてみます。あ、カメラの更新も確認する必要がありました。更新し、フレーム描画終了後にフラグを落とします。今までどおりの描画で、かつ、ノードエフェクト変数の描画の必要性がなければ更新をスキップするよう修正しました。続いて、マテリアルプロパティの方の更新について見てみましょう。今のところテクスチャが指定されていたら、イメージを適用するという処理になっています。修正前の現在のコードは下記の通り要約すると、ひどい仕様。動作しているだけということがわかります。無駄に毎フレーム更新しているので、これも避けたい。マテリアルに対して、可変長のマップを定義できるように修正します。UIは暫定ですけど、修正しました。これはもうファイルフォーマットの修正なので、読み書き、既存のリソースも修正します。加えて、参照イメージファイルも追加、削除できるようにしたかったので修正しました。次に示すのはシーンノードを選択した時のプロパティタブの様子です。プリミティブプロパティ更新の処理を次のとおり修正しました。フラグを見て、立っている時だけセマンティクスアクセスイメージデータの更新を行なうように修正しました。これでテクスチャデータをGPUへ毎フレーム転送する不要な重い処理がなくなりました。描画結果は変わらず、今までどおりのテクスチャマッピングができています。今のところまだマテリアルプロパティは反映されませんがテクスチャマップを任意の数追加し、描画に利用できることを確認しましたのでマルチテクスチャ描画というものをテストしてみます。5枚のディフューズマップを用意し、それぞれに5枚のテクスチャを追加します。上記が追加する5枚のテクスチャです。新しい機能で編集しました。うまく機能していればシェーダにて5枚のブレンドを書けばABCDEが重なった絵が見られるはずです。描画されている状態です。シェーダコードを次のとおり書き換えます。忘れてはならないのがエフェクト変数の追加です。忘れてはならないのが、マテリアル情報の更新です。利用するテクスチャの枚数です。今は1なのでこれを5とします。エフェクトを適用すると初回だけイメージ情報をGPUに転送し、以降は次の更新あるまで転送をスキップします。描画結果が次のとおり。期待した結果になりました。(ガッツポーズ)ここまで、イメージファイルの追加、削除機能を導入テクスチャマップの追加、削除機能を導入エフェクト変数にテクスチャマップを指定することでマテリアルで指定した枚数の任意の数のテクスチャをシェーダに適用できること描画結果に反映されること、GPU側への転送処理を必要回数だけ行なうようにしました。前回やりたいと思っていたことが一つもできていないので作業を進めます。次はマテリアルプロパティを編集した時に、これがマテリアルに反映されるように修正します。ファイルを開いたらクラッシュしてしまいました。テクスチャマップを編集できたのは良いですが、書き込み時に反映されていませんでした。修正して、前回の状態を正しく復元できることを確認しました。マテリアルプロパティの設定できることならば、自動設定を行ってほしいところです。現在のシェーダ自動作成コードを少々編集します。連結するとようにしました。]]>次のように、透明度を上げると透明になります。最終的にプリミティブの変数更新関数は次の形になりました。