1. ホーム
  2. opengl

[解決済み] OpenGL - GLenumはどのように符号なし32ビット整数ですか?

2022-02-16 03:16:32

質問

そもそもOpenGLには8種類のBuffer Objectsがあります。

  • gl_array_buffer
  • gl_element_array_buffer。
  • gl_COPY_read_buffer
  • ...

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

バッファオブジェクトの使い方のほとんどは、このように特定のターゲットにバインドすることです。

glBindBuffer (GL_ARRAY_BUFFER, Buffers [size]);

[void glBindBuffer (GLenum target, GLuint buffer)] documentation

質問ですが、もしenumであれば、その値はそれぞれ0,1,2,3,4...7でなければならないのに、なぜわざわざ7までの値しかない32ビット整数にするのでしょうか?私のCSとOpenGLの知識で申し訳ありませんが、それはちょうど非倫理的なように思われます。

解決方法は?

列挙型はバッファにだけ使われるのではなく、シンボリックな定数が必要なところにはどこでも使われます。現在、数千のenum値が割り当てられています(あなたのGL.hと、最新の glext.h . ベンダは、他のベンダと干渉することなくベンダ固有の拡張を実装できるように、公式の列挙範囲を割り当てられていることに留意してください。さらに、最近の CPU アーキテクチャでは 32Bit 未満を使用しても効率が悪くならないので、性能面でも問題ありません。

UPDATEしてください。 Andon M. Colemanが指摘したように、現在16Bitの列挙範囲のみが割り当てられています。のリンクが便利かもしれません。 OpenGL Enumerant Allocation Policies (OpenGL列挙者割り当て方針) には、以下のような記載があります。

歴史的に、いくつかの単一ベンダーの拡張機能の列挙値は1000のブロックで割り当てられ、ブロック[102000,102999]から始まり、上に向かって増加します。この範囲の値は、16ビットの符号なし整数として表現することができない。このため、一部の実装では、重大かつ不必要な性能上のペナルティが課せられます。既にベンダーに割り当てられたブロックは、ベンダーが自発的にブロック全体を解放しない限り、割り当てられたままであるが、この範囲のブロックは今後割り当てられることはないだろう。

ほとんどが16Bit値で削除されたようですが、32Bit値も使用されています。現在の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
...