3

私は、Minecraft のようなゲームでさまざまなテクスチャを持つ一連のキューブをレンダリングする最も効率的な方法を決定しようとしています。

インスタンス化されたレンダリングを発見しました。私が行ったことは、立方体のすべての頂点、法線、テクスチャ座標を格納する単一の「立方体モデル」を作成し、そこから配列バッファーを作成して一度 GPU に渡すことです。次に、(translation vector, texture index) 構造体の配列を作成し、インスタンス化されたレンダリングを使用して、同じ立方体を何度も再描画します。そのたびに、適切な texture が変換されます。

(うまくいけば、Notch は、私が自分のテクスチャを作成するまで、私が彼のテクスチャを使用することを気にしません)

問題は、すべての 6 面が常に同じテクスチャを持つとは限らないことです。ブロック タイプごとに異なるテクスチャを取得する方法を見つけようとしています。私が思いついた2つの解決策は次のとおりです。

  1. ブロック タイプごとに異なるモデルを使用します。このようにして、頂点ごとに異なるテクスチャ座標を指定できます。インスタンス化されたレンダリングは引き続き使用できますが、ブロック タイプごとに個別のパスを実行する必要がありました。
  2. ブロックごとに 1 つではなく、6 つの「テクスチャ インデックス」(面ごとに 1 つ) を渡します。

2 番目のソリューションでは、より多くの、おそらく冗長なデータを渡す必要があります。インスタンス化されたレンダリングのメリットがどれほど大きいかはわかりません...したがって、たとえば、最大 256 の「パス」(ブロック タイプごとに 1 つ) を実行する方が良いのか、それとも「1 つの大きなパス」を実行する方が良いのかわかりません。すべてのデータを渡して、すべてのブロックを 1 回のショットでレンダリングします。

それとも、私が気付いていない別の方法がありますか?

4

4 に答える 4

6

インスタンスで効率的にできるとは思いません。面/立方体の大部分は表示されず、レンダリングしないことで多くの時間を節約できます。残念ながら、それはすべての立方体を異なるオブジェクトにします。

標準的な解決策 (および Minecraft での方法) は、地形をセクターに分割することです。どの顔が表示されているかを計算し、それらを GPU にアップロードします。キューブが変更されたら、セクターを再アップロードするだけです。セクターをレンダリングするときは、他の計算を行わずにプリミティブを描画するだけです。

スパース ボクセル octreesに基づいて何かを行うことができます。それははるかに手間がかかりますが、世界のどの部分が見えるかを効率的かつ正確に伝えることができます.

于 2012-02-05T20:13:57.157 に答える
1

nVidia 8600M GT では、頂点数とインスタンス数が中程度の「中間」でインスタンス化が最高のパフォーマンスを発揮することがわかりましたが、冗長なデータを削除するために数千回もインスタンス化し、それを更新する努力が必要でした。

頂点配列内の単一のインスタンス化された立方体と共にテクスチャ配列を使用して2を選択し、「インスタンスごとの配列」のテクスチャ インデックスを使用して面テクスチャを選択します。インスタンス属性を提供するために、(予測可能で、ほとんどの場合より高速な)GL_ARB_instanced_arraysを使用してバッファーにアクセスする必要がない場合にも使用できます。gl_InstanceIDインスタンス固有のテクスチャ座標が必要な場合は、それに応じて変更されたシェーダーとともに、追加のインスタンスごとおよび頂点テクスチャ座標配列をバインドします。

于 2012-02-05T19:42:15.580 に答える
0

本当に遅い答えですが、誰かがそれを必要とするに違いありません。

顔のパラメーターを使用して、テクスチャを返すメイン ブロック クラスにメソッドを用意します。複数のテクスチャを必要とする個々のクラスでは、このメソッドをオーバーライドし、switch case または一連の if/else ステートメントを使用します。

これは、ブロック クラスでメソッドがどのように見えるかです。

public int getBlockTexture(int face){
     if(face = top){
         return grass top
     } else if(face = bottom){
         return grass bottom
     } else {
         return grass side
     }
}

レンダラーでこれを使用する方法については、各面をレンダリングする前にテクスチャを取得します。カリングのやり方に似ています。

于 2015-01-20T05:31:15.153 に答える