2

GL_OBJECTENUMERATIONiOpenGL仕様には、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_TEXTURE0GL_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バインディングを構築するための最善の方法に関して興味深い質問を提起します。

4

3 に答える 3

4

定数は値35661の定数であるため、受け入れられる定数のセットはGL_TEXTURE0からGL_TEXTURE35660でなければならないことを意味します。

いいえ、それはこれを意味するものではありません。GL_MAX_COMBINED_TEXTURE_IMAGE_UNITSは実装に依存する値であり、実行時にを使用して照会されます。glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, out)

残りについて:OpenGL仕様では、GL_TEXTURE = GL_TEXTURE0 + iであり、他のすべてのオブジェクトタイプについても同様でi < nあり、nは妥当な数です。

于 2012-10-22T21:48:14.967 に答える
3

これは、私がタイプで特別にセクシーになることはあなたに多くを買うとは思わないそれらの状況の1つです。

GL_TEXTURE()に特別な整数型を作成し、type GL_TEXTURE is 16#84C0# .. 16#8B4C#;その型をGLテクスチャを探すすべてのパラメーターに使用する場合、コンパイラーは、ユーザーがそれらと他の整数オブジェクトの間で計算を実行できないようにします。それはおそらく十分でしょう。それは、貧弱なC / C ++コーダーが立ち往生しているものよりも確かにはるかに優れています!

繰り返しになりますが、私は超厚いエイダビンディングの支持者ではありませんでした。Adaバインディングを使用して、型をよりAdaに似たものにし、Cエラーコードを例外に変換する必要があります。ユーザーの作業を少し節約する他の方法がある場合は、先に進んでそれを実行してください。ただし、APIの機能を抽象化しないでください。


整数サブタイプではなく別の数値型を使用するという私の選択について、コメントに複数の質問がありました。

integer実際、サブタイプが実行されるときにカスタム数値型を作成し始めてから、実行する必要のあるすべての型変換に悩まされることは、Adanoobのよくある間違いです。古典的な例は、速度用の型、距離用の型、力用の型を作成し、すべてのくそった数学演算で型変換を実行する必要があることを発見した人です。

ただし、カスタム数値タイプが必要になる場合があります。特に、そのタイプのオブジェクトが通常の整数とは別のタイプユニバースに存在する必要がある場合は常に、カスタム数値タイプを使用する必要があります。これの最も一般的な発生は、APIバインディングで発生します。この場合、問題の番号は、実際には一部のリソースのC風の指定です。これが私たちがここにいる正確な状況です。sで実行したい唯一の計算はGL_Texture、型の境界との比較、およびリテラル量による単純な加算と減算です。(ほとんどのGL_Texture'next()場合、十分です。)

大きなボーナスとして、それをカスタムタイプにすると、API呼び出しでGL_Texture値を間違ったパラメーターにプラグインするという一般的なエラーを防ぐことができます。C API呼び出しは、その機能を気に入っていintます...

実際、座ってそれらをすべて入力するのが合理的であるなら、あなたはただ物事を列挙するように誘惑されるだろうと私は思う。それは変換なしではさらに互換性が低くなりますIntegerが、ここでは誰もそれについて二度考えません。

于 2012-10-22T22:09:46.843 に答える
2

OK、OpenGLについて知っておく必要のある最初のルール:「XからYに移動する」というものがあり、それらの値の1つがである場合は常に、の数値については話していません彼らはあなたがでクエリする実装依存の値について話している。これは通常整数であるため、何らかの形式を使用してクエリを実行します。GL_THINGYGL_THINGY GL_THINGYglGetIntegerv

次:

この設定は、サブタイプがばらばらであるだけでなく、順序が狂っている可能性があることを意味します。そのため、次のC風のマッピングが有効になります。

いいえ、そうではありません。

OpenGLのすべての実際の列挙子には、ARBによって特定の値が割り当てられます。また、名前付きGL_TEXTURE''i''列挙子のARB割り当て値は次のとおりです。

#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84C3
#define GL_TEXTURE4 0x84C4
#define GL_TEXTURE5 0x84C5
#define GL_TEXTURE6 0x84C6
#define GL_TEXTURE7 0x84C7
#define GL_TEXTURE8 0x84C8

それらがすべて順番に並んでいることに注目してください。

残りについては、OpenGL4.3仕様から引用させてくださいglActiveTexture

無効なテクスチャが指定された場合、INVALID_ENUMエラーが生成されます。textureは、TEXTURE'' i''の形式のシンボリック定数であり、テクスチャユニット''i''が変更されることを示します。定数はTEXTURE''i'' = TEXTURE0 +'' i''に従います。ここで、''i''は0から''k''-1の範囲であり、''k''はMAX_COMBINED_TEXTURE_IMAGE_UNITSの値です。

ある言語でバインディングを作成している場合、一般的な考え方は次のとおりです。「特定の値を強く入力しないでください」。特にこれ。ユーザーから提供されたものをすべて受け取り、それを渡します。ユーザーがエラーを受け取ると、エラーが発生します。

glActiveTextureさらに良いことに、列挙子の代わりに「整数」を取り、自分で加算を行う、より合理的なバージョンを公開します。

于 2012-10-22T23:15:22.493 に答える