何千もの頂点を持つOpenGLシーンがあり、それらをVBO/IBOとして渡したいと思います。glGetIntegerv(GL_MAX_ELEMENTS_VERTICES、&maxVertices)コマンドを実行すると、最近のビデオカードを使用しているにもかかわらず、頂点の最大数が2048に制限されていることがわかります。それに加えて、Cの配列はintに制限されているため、最大32kの頂点になります。
これらの制限を回避して、とにかくすべてのオブジェクトを表示するにはどうすればよいですか?
定数は呼び出しGL_MAX_ELEMENTS_VERTICES
にのみ適用され、glDrawRangeElements
それでもそれより大きい値は確かに。glDrawRangeElements
より遅くなることはありませんglDrawElements
。バッチをできるだけ大きくし、呼び出しをできるだけ少なくする必要があるため、バッチを手動で小さな部分に分割することはお勧めできません。この値を忘れてください。もう本当の意味はありません。
ちなみに、最新のプラットフォーム(少なくともVBOをサポートするグラフィックスデバイスを備えたプラットフォーム)では、intは少なくとも32ビット幅である必要があるため、intは32kよりもはるかに大きい値を保持できると確信しています(したがって、 2G / 4Gのような値を保持します)。組み込みデバイス(OpenGL ESを使用)では、16ビットの頂点インデックスに制限される場合があります。
GL_MAX_ELEMENTS_VERTICESは、glDrawRangeElementsの1回の呼び出しに渡すことができる最も多くの頂点を示しているだけではありませんか?シーンをビットに分割してビットを1つずつレンダリングできない理由はありますか?
頂点の総数を2048で割り、多くのVBOよりも多く作成します
void glGenBuffersARB(GLsizei n, GLuint* ids)
したがって、nは(合計/ 2048)+1になり、idは(合計/ 2048)+1を含むGLuint配列になります。