2011-12-30 2 views
0

質問は2Dに特有です。バッファリングdirect3d描画操作

私は常に更新されているテクスチャです。これは自分のレイヤーのレンダーターゲットです。この更新は、テクスチャ全体の再描画であり、スプライトの描画とテキストの出力によって実行されます。操作は頻繁に実行され、非常に多くのCPUを消費します。もちろん、再描画の回数を最適化してそれを抑えています。

これらの操作をDirect3Dでバッファリングする方法はありますか?現在は、スプライト/テキスト操作のチェーンを繰り返し構築する必要があるためです。どのようなゲームが世界の更新を行うと仮定しますか?この退屈な仕事をどのように克服しますか?おそらく、より多くのレイヤーを作成することによって?

私にとって最善のことは、変更可能な描画チェーンオブジェクトを作成することですが、Direct3Dではこのようなものは見つかりませんでした。

答えて

1

あなたに見えるかもしれませんいくつかの一般的な方法があります。

  • バッチ処理:オーダーと組み合わせることが可能な限り少ない呼び出しを実行し、状態が変化することができますようにとの間など多くのオブジェクトを描画するために描画しますが。
  • キャッシュ:できるだけ多くのジオメトリを頂点バッファに保持します。 2Dでは、ほとんどのものがテクスチャ付き四角形であるため、これはより面白くなります。その場合...
  • シェーダ:クワッドのX/Y位置/サイズを示すfloat4を取る頂点シェーダを作成し、それを使用して4つの頂点を描画することができます。フルマトリクスの状態を変更する必要はなく、シェーダで4つの浮動小数点数を更新するだけです(すべてのビューの計算をスキップし、メモリと計算量を75%削減します)。 ...
  • ステートブロック:すべての色、モード、およびシェーダがバインドされた各タイプのスプライトのステートブロックを保存します。ステートブロックは、シェーダで使用されています。次に、状態ブロックを適用し、テクスチャをバインドし、座標を設定して描画します。最高でも、各スプライトを4回まで呼び出すことができます。まだまだ...
  • Cull:何かを描かないのが最善です。単純な画面の境界チェック(別の方法で実行されるper-poly cullingより速い)、並べ替えと基本的なオクルージョン(透明なスプライトのフラグ)を行うことができれば。 2Dでは、ほとんどのカリングチェックは非常に安価です。できるだけどこでもソートして切り抜くことができます。

実際にバッファリングしている限り、ドライバーはそれが適切なときに、いつ、どこでそれを処理します。ステートブロックは、すべてのモードを1回の呼び出しで配信することでバッファリングを行うことができます(良いか悪いかは忘れてしまいますが、有益と思われますが)。

if (sprite.Visible && Active(sprite) && OnScreen(sprite)) 
{ 
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad); 
} 

は、CPUの使用に非常に役立つ可能性があります。

関連する問題