オブジェクト(クマさん)用の頂点シェーダープログラム。背景用の頂点シェーダープログラム。環境マップ用のテクスチャーとして存在します。リンクを張ったというのは内緒です)。作り方キューブマップとは、6枚のテクスチャーを使って、立方体で取り囲んだテクスチャーです。底面があってないのが、ばればれだな。こんなものをどうやって作るのでしょう。ツールが含まれています。Tool]がそれです。Face]を使って、各面のテクスチャーを読み込みます。earth_d.bmpで、貼り付けています。極座標の変形のフィルターを使って加工し、サイズを調整して出力しました。何か方法はないのかしらん。■サポートしてる?今回は、頂点シェーダーだけでなく、キューブマップをサポートしているかどうかも調べなければなりません。サポートしていなければ、全部ソフトウェアで実行するようにしました。よい子は、頂点シェーダーは別に調べて、適切な初期化をして下さい。初期化に失敗しました。S_OK;}黄色い部分が、今回の変更点です。■外壁を描く(ザコ戦)最初に、周りを取り囲んでいる地球のテクスチャーを張った外壁を描画します。頂点シェーダーで、オブジェクトが描ける人は、とっとと次に進んでください。使用する(グローバルな)オブジェクトは、次の4つです。各面のテクスチャーpCubeTex[6]と、頂点シェーダーhCubeVertexShaderです。hCubeVertexShader=~0;頂点シェーダー用に、定義する頂点情報は、次のものを用います。D3DVSD_END()};頂点と座標だけの、今まで取り扱ったものの中で、いちばん簡単なものになっています。外壁に必要な部分だけを抜き出しました。正方形の箱を作成します。他のプログラムからそのメモリを使えなくしておいて、値を代入します。バッファを作成して、各ポリゴンがどの頂点を使うか指定します。その後、それぞれの面のテクスチャーを読み込みます。最後に、使用する頂点シェーダーを読み込みます。行列、射影行列を作ったら、その積を計算して、頂点シェーダーのc0~c3レジスタに入れます。バッファを指定して、頂点シェーダーに描画してもらいます。各面を描く時に、テクスチャーを指定しなおして(張り替えて)描画します。他で何があるか分からないので、テクスチャーレジスタの設定をテクスチャーの色だけを使う(頂点色は使わない)設定にしました。略}今回の頂点シェーダーはあっさりです。透視変換して、テクスチャーのUV値をそのままコピーするだけです。v7後片付けは、以上グローバルなオブジェクトを開放するだけです。(ボス戦)では、ボスキャラのクマさんの描画です。ミラーコーティングをした完全反射のクマさんを表示します。いうテクスチャー用のブローバル変数を用意します。後は、頂点シェーダーを用いて、モデルを描画する時と同じです。レジスタを先に設定しました。S_OK;}次に描画部分です。今度は、(大きすぎたので)少し小さくしたり、回したり、位置を調整するワールド行列を作ります。あること意外は同じです。}}外壁と大きく違うのは、頂点シェ-ダーです。座標変換するだけでなく、法線を用いてテクスチャー座標の計算をします。キューブマップで指定するテクスチャー座標は、このベクトルを代入します。このベクトルは、法線Nを持つ平面に関して、視線を反射させた時のベクトルです。ありがちな反射ベクトルを説明する絵ですが、この説明で理解できるでしょうか?複雑と思われるかもしれませんが、ここから先、自分で各テクスチャーの各UV値を求めるのは至難の業です。ここまでサポートしてくれるなら、大いに喜ぼうではありませんか。■屈折マッピングさて、屈折です。下の画像を見てください。インドネシアが透けています。オーストラリアも引き伸ばされて表示されています。屈折と反射がどこが違うかというと、実は一箇所だけです。(屈折)これによる変化は、テクスチャー座標です。このベクトルを図示すると、のように、反射ではなく、内部にもぐりこむ屈折の作用を引き起こします。ゲームや、デモとして使われる分には、必要十分な効果でしょう。■最後に今回は、屈折のデモを解説してみました。小手先のテクニックでずいぶんやれるものだと感心しています。こんな、一寸のネタで大いに驚かすような物を作りたいですね。もどるimagire@gmail.com。