私は多くのキューブからゲームを作りたいと思っており、モバイル プラットフォームと webgl を使用して Web に配置することを計画しています。私の問題は、キューブごとに drawelements 呼び出しを行うと、フレームレートに影響を与えることです。それらを描画するために opengl es への単一の描画呼び出しを行う方法はありますか? キューブ間の唯一の違いは、位置と色です。
3 に答える
私も同じ問題に遭遇しました。私は同様の質問をし、昨日自分で答えました。を見てみましょう:
頂点バッファーを作成し、gl.bufferData を使用して 1 回だけグラフィック カード メモリにアップロードします。次に、gl.drawElements または gl.drawArrays を実行するたびに、そのバッファへの参照を使用します。次に 3D シーンのコンテンツが変更されるまで、グラフィック カード メモリにアップロードされたこのバッファを使用できます。
glDrawElements()に頂点配列を使用している場合は、代わりに頂点バッファオブジェクトを使用することをお勧めします。これにより、クライアント側(システムRAM)ではなくデータサーバー側(GRAM)が保存されます。このようにして、CPU <-> GPUデータ転送のオーバーヘッドを大幅に減らしてglDrawElements()呼び出しを行うことができます。
または、キューブをディスプレイリストに保存することもできます。このように、glTranlate()を使用して立方体を移動し、ディスプレイリストを呼び出してレンダリングすることができます。ディスプレイリストを使用する際の唯一の注意点は、ディスプレイリストで行うことはすべて不変であるということです。ディスプレイリストの呼び出しは、完全に再コンパイルせずに変更することはできません。
セルをデキューする方法については、UITableView のモデルに従います。描画したオブジェクトを追跡し、それらを識別子にリンクするオブジェクトを作成します。次に、その識別子を使用してそれらを単純にデキューできます。同じオブジェクトの多くのバージョンを描画することがわかっている場合は、そのオブジェクトを使用してレンダリング/割り当てを最小限に抑えます。