2016-09-18 21 views
0

私は地形や建物のような多くの固定オブジェクトを持っていますが、描画呼び出しを減らし、オブジェクトが多すぎるとパフォーマンスを向上させるためにそれらをすべて1つのVBOにマージしたいです。 idsの配列では、私の質問は、1つのVBOにテクスチャをバインドすることができますか、私はそれぞれのテクスチャのための別のVBOを作成する必要がありますか?または、オフセットと長さに基づいて1つのVBOに多くのglDrawArraysを作成することができますか?Android OpenGL ES2 1つのVBOのための多くのテクスチャ

答えて

1

ES 2.0では、1回の描画呼び出しで複数のテクスチャを使用したい場合は、テクスチャアトラスを使用することをお勧めします。基本的には、複数の論理テクスチャのテクスチャデータを単一のOpenGLテクスチャに格納し、テクスチャ座標は、各プリミティブに目的のテクスチャデータが使用されるように選択されます。これは、元のテクスチャ座標を調整することによって、またはidをシェーダに送り、idに基づいてテクスチャ座標にオフセットを適用することによって行うことができます。

もちろん、1つのVBOに対して複数のglDrawArrays()呼び出しを使用して、それらの間に異なるテクスチャをバインドすることができます。しかし、それはドローコールの数を減らすというあなたの目標に反するものです。これらのタイプの最適化に多くの時間を費やす前に、ドローコールの数が実際にボトルネックになっていることを確かめる必要があります。

OpenGLのさらに高度なバージョンでは、配列テクスチャのようなこのユースケースを助ける追加機能があります。

+0

最初のオプションはそれほど簡単ではないので、私は2番目のものを選択します。これは、それぞれ独自の描画メソッドを持っているか、またはそれらをマージして、オフセットを取得した後に、およびVBOの部分の長さ? – Mohamed

0

多くのGame Engineが低描画呼び出しを実現するためにいくつかの標準的なテクニックがあります。

バッチ処理:このテクニックは、同じマテリアルを参照するすべてのオブジェクトを結合し、それらを1つのメッシュに結合します。オブジェクトは静的である必要はありません。それらが動的である場合、Model Matrix配列を渡すことによってそれらをバッチすることもできます。

テクスチャAtlas:すべての静的メッシュのテクスチャアトラスを作成することは、他の答えで述べたように最良の方法です。しかし、テクスチャを効率的に結合し、それに応じてUVを更新するためには、多くの作業を行う必要があります。

関連する問題