視点の切り替え時にレンダリング&Zバッファを作成、保存しておき次からはその視点である限りコピーして使いまわそう、と考えまして。これなら、とてもポリゴン数が増えても、切り替え時しかレンダリングしないので結構イケますよね。Zバッファのコピーはやってみるとできないじゃないですか。(笑)色々と調べましたが、どうやらだめで。ロックすればなんとかできそうですが、機種が限られてしまうとか。今は、背景となるポリゴンをテクスチャをひっぺがしてライティングなしで、極力負荷が抑えられるように描画し(Zバッファ書き込みだけが必要であるため)、その上に保存しておいた一枚絵を描画しています。なんとか、解決する方法ありませんかな、と思って投稿しました。皆様のお知恵をお貸しください。いえば深度バッファへの書き込みはやっていなかったので、実装してみました。今回のプログラムは、次のものです。(背景マッピング:DirectX9(ピクセルシェーダ2.0)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースあと、実行ファイル、プロジェクトファイルが入っています。■何やってるの?今回の方法は、あらかじめ背景の色と深度バッファの値をテクスチャに保存しておいて、レンダリングの時には、背景を描画する代わりにこれらのテクスチャをレンダリングします。今回は、初期化時やカメラが変わった時に背景画像を作り直していますが、基本的には、RGB8ビットの画像なので、バイオハザードのようなカメラが変わらないゲームでは、あらかじめ画像ファイルを用意しておいて、適当なときに読み込むのが良いでしょう。上の図で、深度バッファのイメージがカラフルなことに気がついたでしょうか。我々が普段使う深度バッファは16ビットないしは24ビットの精度があります。これをそのままテクスチャに書き出しただけでは8ビットの精度に落ちてしまうので、深度値を各色成分に上位、中位、下位に分けて保存しました。浮動小数点バッファを使う手もありますが、今回は汎用性を重視して個の実装にしました。depth)のようにすれば、それぞれの上位8ビットを取って適当な値が保存されます。(256.0*256.0)のようにすればよいでしょう。実際にテクスチャを見ると、次のようになります。■背景テクスチャの作成ということで、今回のプログラムを紹介してきましょう。頂点シェーダから出力された座標In.Posから、深度バッファに記録される値In.Pos.z/In.Pos.w計算して、色ごとに深度値をテクスチャに出力します。}ちなみに、今回は、マルチレンダリングターゲットを使って、色と深度値を一度に別々のテクスチャに出力しました。ピクセルシェーダから出力されるデータは、次のような構造体です。};頂点シェーダも特別なプログラムを組まなくてはなりません。テクスチャ座標を通して、頂点シェーダからピクセルシェーダに座標値を出力します。TEXCOORD1の2つに同じ座標値を出力します。}アプリケーション側で用意するオブジェクトは、色用と深度用の2枚のテクスチャとそのサーフェス、また、レンダリング時に使う深度バッファになります。m_bCreateというフラグを用意しました。これは、カメラが変わったときと初期化時にTRUEになるフラグで、これがたっているときにテクスチャを描画します。描画するプログラムですが、レンダリングターゲットを変更するときの基本的な手法と同じく、今までのレンダリングターゲットを保存しておいてから、レンダリングターゲットを切り替えます。今回は、2枚のテクスチャに同時に書き込むので、レンダリングターゲットの設定SetRenderTargetは、2回呼び出します。m_pd3dDevice->SetViewport(&viewport);描画するときは、先ほど作成したシェーダに描画方を切り替えて普通に描画します。今回の背景が白いのは、仕方なくやっていることです。深度テクスチャとして初期化すべき値は1.0なのですが、深度用のテクスチャと色用のテクスチャで違う色で初期化できないので、全てのテクスチャを白で初期化します。m_pEffect->End();最後にレンダリングターゲットを元に戻してテクスチャの作成は終了です。2つめのレンダリングターゲットにNULLを設定することを忘れないようにしましょう。}■背景の描画さて、後は、用意したテクスチャを使って背景を描画しましょう。これは、普段画面クリアして、背景を描画するルーチンと下のルーチンを置き換えます。基本的には、エフェクトを使って、四角形ポリゴンを全画面に表示しているだけです。指定して、深度テストに常に合格するようにすることです。これがないと、現在の深度バッファの値よりも奥の深度に書き込めなくなってしまいます。シェーダですが、次のように色成分はそのまま出力して、深度成分は成分ごとに格納された深度値の値を元に戻して出力します。}なお、ピクセルシェーダからの出力は、次の構造体になります。セマンティクスを使って、深度値の出力を宣言します。確かに有効な方法であることが確認できました。画像を更新するフレームには気をつけてください。ところで、この技法って、どこかの会社が特許とってますかねぇ。取られていても不思議でない気がするのですが、どなたかご存知ですか?もどるimagire@gmail.com。