5

まず、OpenGL には 8 種類のバッファ オブジェクトがあります。

  • GL_ARRAY_BUFFER</li>
  • GL_ELEMENT_ARRAY_BUFFER</li>
  • GL_COPY_READ_BUFFER
  • ...

それらは列挙型、またはより具体的には GLenum です。GLenum は、最大 4,743,222,432 までの値を持つ符号なし 32 ビット整数です。

バッファオブジェクトの使用のほとんどは、次のような特定のターゲットへのバインドを伴います:

glBindBuffer (GL_ARRAY_BUFFER, バッファ [サイズ]);

[void glBindBuffer (GLenum ターゲット、GLuint バッファ)] ドキュメント

私の質問は-その列挙型の場合、その唯一の値はそれぞれ0,1,2,3,4..7でなければならないということです.7までの値しかないのに、どうしてわざわざ32ビット整数にするのですか? CS と OpenGL に関する私の知識を許してください。それは非倫理的なようです。

4

2 に答える 2

6

列挙型はバッファのためだけに使用されるのではなく、シンボリック定数が必要なあらゆる場所で使用されます。現在、数千の列挙型の値が割り当てられています (GL.h と最新のglext.hを調べてください。ベンダーには公式の列挙型の範囲が割り当てられていることに注意してください。これにより、ベンダー固有の拡張機能を他のものと干渉することなく実装できます。したがって、32 ビットの列挙型スペースはさらに、最新の CPU アーキテクチャーでは、32 ビット未満を使用しても効率が良くないため、パフォーマンスに関しては問題になりません。

更新: Andon M. Coleman が指摘したように、現在 16 ビットの列挙範囲のみが割り当てられています。OpenGL Enumant Allocation Policiesにリンクすると役立つ場合があります。これには、次のコメントもあります。

歴史的に、一部の単一ベンダー拡張の列挙値は、ブロック [102000,102999] から始まり、上に向かって 1000 のブロックで割り当てられていました。この範囲の値は、16 ビットの符号なし整数として表すことはできません。これにより、一部の実装ではパフォーマンスが著しく不必要に低下します。ベンダーに既に割り当てられているブロックは、ベンダーが自発的にブロック全体を解放しない限り割り当てられたままになりますが、この範囲内のそれ以上のブロックは割り当てられません。

これらのほとんどは 16 ビット値のために削除されたようですが、32 ビット値が使用されています。現在の glext.h では、次のように 0xffff を超えるいくつかの (廃止された) 列挙型をまだ見つけることができます。

#ifndef GL_PGI_misc_hints
#define GL_PGI_misc_hints 1
#define GL_PREFER_DOUBLEBUFFER_HINT_PGI   0x1A1F8
#define GL_CONSERVE_MEMORY_HINT_PGI       0x1A1FD
#define GL_RECLAIM_MEMORY_HINT_PGI        0x1A1FE
...
于 2013-12-29T20:18:29.693 に答える