描画に関係しないシステム的な部分。ロードのインターフェイス。(空デカール)あと、モデルのファイル、実行ファイル及び、プロジェクトファイルが入っています。今回のテクスチャーに使うためでした(そうでなければ、適当にゆがめた方が綺麗な結果が得られます)。前回のテクスチャーを視線を前と後ろに向けてレンダリングすると次の2枚のテクスチャーが得られます。ここで、それぞれの赤い色の円の部分を見てください。張り合わせたら丁度重なります。この2枚のテクスチャで全景を覆うことになります。環境マップを行うためには、反射ベクトルを求め、反射ベクトルの対応するテクスチャ座標を計算する必要があります。反射ベクトルは、視線ベクトルと法線ベクトルから求められます。反射ベクトルのxy平面への射影からxy平面での距離が求まります。その原点からの距離からテクスチャ座標を求めます。テクスチャ座標を求めるために、特殊な量を計算しましょう。計算するかというと、いろいろ計算した結果、その量が必要だったからです。下の図を見てください。原点を通る(反射)ベクトルとz軸のなす角をθとします。このθの定義から、tanθ=rXY/rZになります。rXYをθに関して方程式を解きます。cosθさて、以上で必要な量の計算は終わりました。テクスチャ座標を求めましょう。x軸、y軸に振った量になります。ryは、反射ベクトルのx、y成分です。0.5を掛けて足すのは、テクセル中心が(0.5,0.5)にあるからです。ここで、最後の項に注目しましょう。(rXYは、放物線の式から求めた値で、sinθとは異なります)。rzこの式が実際に使える公式です。反射ベクトルの量で、テクスチャ座標が求まりました。zを負にした放物線に関するテクスチャー座標を使います。反射ベクトルのz座標の正負でテクスチャを判定する方法で綺麗につながるのかといえば、綺麗につながります。球をレンダリングすれば分かりやすいでしょうか。球をレンダリングすると、次の結果が得られます。この球に、2枚の画像が張られていることが分かりやすいように2枚のテクスチャーの空の色を変えると、と、途中で張り合わされていることが明らかになります。途中の継ぎ目は色が同じならば、ほとんど見えません。いうことで、かなり「使える」方法であることが確認できると思います。今回、特別なプログラムは、主に2つのシェーダプログラムで出来ています。一つ目は、前回やった環境マップを作るためのシェーダと、もう一つは環境マップを張るためのシェーダです。環境マップを張るシェーダは次のようになります。v7前回のもの、そのままです(というより、今回のために前回のシェーダを作ってのですが)。ピクセルシェーダも使っていますが、普通に表示するだけなので、固定ファンクションでも十分です。重要なのは、ビュー行列です。行列は車の位置(を少し浮かした重心的な場所)を視点として、注目点を視点の前後にしました。これらのベクトルからビュー行列を作成し、環境マップを作ります。&up);■マッピングいよいよ環境マップを張ります。簡単なプログラムになっているピクセルシェーダを最初に見ましょう。テクスチャの1番目と2番目に表と裏の環境マップをロードします。頂点色のα成分にどちらのテクスチャを使うのか0.5以上か以下かで入れておきます。命令でどちらかのテクスチャを引っ張り、適当に強さを調整して頂点色に加算します。気を取り直して頂点シェーダです。頂点シェーダでは、適当なテクスチャ座標やどちらのテクスチャを使うかを出力しなくてはなりません。c12.y座標変換や頂点色は普通と同じ物です。座標変換は命令数を減らせるので、適当に修正してください。今回は、環境マップを作る行列と同じ行列を使いまわしたのでこうなっています。テクスチャ座標とどちらのテクスチャを使うのか選択するアルファ値として、反射ベクトルを計算します。反射ベクトルは視線ベクトル(=視点-頂点の位置)と法線ベクトルから計算します。頂点色のα=視線ベクトルのZ成分+0.5で、ピクセルシェーダにどちらの色を渡すか決定します。1+rzの公式を使って、計算します。裏面はz軸の正負が反転します。張り合わせている関係で、一枚(ここでは表面)のx軸が反転します。これらの向きは実は目で見てあわせました。マッピングをしました。作ってて気が付いたのですが、視線方向からのテクスチャーを作れば1枚のテクスチャーで環境マップが出来ますね。視線方向に依存するようになるのですが、球マップよりもゆがみが小さくなるので、悪くない方法だと思います。今回やってみて(特に球のモデルにマッピングするときに感じたのですが)、テクスチャーがでこぼこと張られてしまうのが気になります。ミップマップなどの適当な方法で綺麗になるのかは分かりませんが、何とかしたいものです。もどるimagire@gmail.com。