では、どうすれば同様のジオメトリをより良い方法で描画できますか...
@Ian Mallettが説明したように; すべての頂点データを単一の頂点バッファー オブジェクトに入れます。これにより、1 回の呼び出しでマップをレンダリングできます。マップが 1000 倍大きくなった場合、画面に表示されている頂点のみを描画するカメラ ソリューションを実装することをお勧めしますが、これは、非常に大きなマップを計画している場合に後で発生する問題です。
...そして、テクスチャの特定の領域のみを VBO にバインドするにはどうすればよいですか?
テクスチャ全体のみをバインドできます。マップしたいテクスチャの特定の領域を指す必要があります。
すべてのテクスチャ座標は、特定の頂点に関連しています。すべてのタイルは 4 つの頂点に関連しています。ゲーム内の一般的なタイルは同じテクスチャを共有するため、「タイル マップ」という名前が付けられています。それを利用してください。すべてのタイル テクスチャをテクスチャ シートに配置し、そのテクスチャ シートをバインドします。作成する新しい「タイル」ごとに、エリアが空中、草、地面のいずれであるかを確認し、意図するものに対応するテクスチャの部分をポイントします。
ピクセル単位のテクスチャ領域が 100x100 であるとします。グラウンド領域は、左下隅から 15x15 です。上記のロジックに従って、以下に示すサンプル コードを説明します。
// The vertexData array simply contains information
// about a tile's four vertices (or six
// vertices if you draw using GL_TRIANGLES).
mVertexBuffer.put(0, vertexData[0]);
mVertexBuffer.put(1, vertex[1]);
mVertexBuffer.put(2, vertex[2]);
mVertexBuffer.put(3, vertex[3]);
mVertexBuffer.put(4, vertex[4]);
mVertexBuffer.put(5, vertex[5]);
mVertexBuffer.put(6, vertex[6]);
mVertexBuffer.put(7, vertex[7]);
mVertexBuffer.put(8, vertex[8]);
mVertexBuffer.put(9, vertex[9]);
mVertexBuffer.put(10, vertex[10]);
mVertexBuffer.put(11, vertex[11]);
if (tileIsGround) {
mTextureCoordBuffer.put(0, 0.0f);
mTextureCoordBuffer.put(1, 0.0f);
mTextureCoordBuffer.put(2, 0.15f);
mTextureCoordBuffer.put(3, 0.0f);
mTextureCoordBuffer.put(4, 0.15f);
mTextureCoordBuffer.put(5, 0.15f);
mTextureCoordBuffer.put(6, 0.15f);
mTextureCoordBuffer.put(7, 0.0f);
} else { /* Other texture coordinates. */ }
あなたは実際に解決策を書きました。唯一の違いは、テクスチャ座標データを GPU にアップロードする必要があることです。