19

ボクセルをopenglで描きたいのですが、サポートされていないようです。24 頂点 (1 面あたり 4 頂点) の立方体描画関数を作成しましたが、2500 立方体を描画するとフレーム レートが低下します。もっと良い方法があることを願っていました。理想的には、位置、エッジ サイズ、および色をグラフィックス カードに送信したいだけです。GLSL を使用して命令をフラグメント シェーダーまたは頂点シェーダーの一部としてコンパイルすることで、これを実行できるかどうかはわかりません。

Google で検索したところ、ポイント スプライトとビルボード スプライトが見つかりました (同じものですか?)。立方体をすばやく描画する代わりに、それらを使用できますか? 各面に 1 つずつ 6 つを使用すると、グラフィックス カードに送信される情報がはるかに少なくなり、フレーム レートが向上することが期待されます。

もう 1 つの考えは、1 回の drawelements 呼び出しを使用して複数の立方体を描画できるのではないかということです。

たぶん、私が知らないより良い方法がありますか?どんな助けでも大歓迎です。

4

3 に答える 3

20

立方体を使用してボクセルを描画することは、ほとんどの場合、間違った方法です(例外的なケースはレイトレーシングです)。通常は、データを3Dテクスチャに配置し、カメラの位置に応じてスライスをレンダリングします。https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.htmlを参照してください。「ボリュームレンダリングGPU」を検索すると、他の手法を見つけることができます。

編集:上記の答えを書いているとき、私はOPがMinecraftがそれをどのように行うかにおそらく興味を持っていることに気づいていませんでした。Minecraftスタイルのラスタライズを高速化する手法については、多数の立方体をレンダリングするためのカリング手法を確認してください。グラフィックハードウェアの最近の進歩により、レイトレーシングによるMinecraftのレンダリングが現実になる可能性があります。

于 2010-09-25T17:37:28.923 に答える
7

あなたが探しているものは、インスタンス化と呼ばれます。いくつかの可能性をglDrawElementsInstanced検討することができます。glDrawArraysInstancedこれらはコア操作として比較的最近 (OGL 3.1) に追加されただけですが、拡張機能としてはかなり前から利用可能であることに注意してください。

nVidia のOpenGL SDKには、OpenGL でインスタンス化された描画の例があります。

于 2010-09-25T16:41:15.667 に答える
1

まず、GLSL を使用して OpenGL 3+ を確認する必要があります。これはかなり前から標準になっています。第 2 に、ほとんどの Minecraft 風の実装では、CPU 側でメッシュ作成が使用されます。この手法では、すべてのブロック位置を確認し、露出したすべての面の三角形をレンダリングする頂点バッファー オブジェクトを作成します。VBO は、ボクセルが変更されたときにのみ生成され、フレーム間で保持されます。理想的な実装は、同じテクスチャの同一平面上の面を結合してより大きな面にすることです。

于 2016-12-08T22:00:58.820 に答える