GL_OBJECTENUMERATIONi
OpenGL仕様には、0から。のようなもので示される数値までの範囲のiを持つfromの値のセットをとる特定のパラメーターがありますGL_MAX_OBJECT
。(一例として、ライトは「オブジェクト」です。)示されている数値が上限であることが明らかであり、間接参照を提供するglGet関数を通過する必要があります。
ただし、OpenGL仕様の文字通りの解釈によれば、 glActiveTexture の「texture」パラメーターは、定数が値35661の定数であるため、must be one of GL_TEXTUREi, where i ranges from 0 (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
受け入れられる定数のセットがtoでなければならないことを意味します。GL_TEXTURE0
GL_TEXTURE35660
言語の弁護士はさておき、この設定は、サブタイプがばらばらであるだけでなく、次のC風のマッピングが有効になるように順序が狂っている可能性があることを意味します。
#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84A0
#define GL_TEXTURE4 0x84A4
#define GL_TEXTURE5 0x84A5
#define GL_TEXTURE6 0x84A8
#define GL_TEXTURE7 0x84A2
まず、これは実際の問題ですか、それとも定数は常にGL_OBJECTi
= GL_OBJECTi-1
+1のように配置されていますか?
その関係が当てはまる場合は、Adaのサブタイプ機能を使用して、無効なパラメーターの受け渡しを回避する可能性があります...
理想的には、次のようなものです。
-- This is an old [and incorrect] declaration using constants.
-- It's just here for an example.
SubType Texture_Number is Enum Range
GL_TEXTURE0..Enum'Max(
GL_MAX_TEXTURE_COORDS - 1,
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1);
しかし、最大値が動的に決定される場合は、次のことについていくつかのモンキーを行う必要があります。
With GL_Constants;
Generic
GL_MAX_TEXTURE : Integer;
-- ...and one of those for EACH maximum for the ranges.
Package Types is
Use GL_Constants;
SubType Texture_Number is Enum Range
GL_TEXTURE0..GL_MAX_TEXTURE;
End Types;
Package GL_TYPES is new Types( GL_MAX_TEXTURE => glGet(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) );
この新しいパッケージをインスタンス化して使用GL_TYPES
すると、単純なサブタイピングよりも少し手間がかかり、少し面倒になります。
これのほとんどは、OpenGLにまったく新しいものであり、それを完全に理解/理解していないことに起因します。しかし、それは、良い、厚いAdaバインディングを構築するための最善の方法に関して興味深い質問を提起します。