4

OpenGL Superbible 5 を読んで、ユニフォーム バッファ オブジェクトの使用方法を学ぼうとしています。シェーダーにユニフォーム ブロックがあります。

layout(std140) uniform SkeletonBlock  
{  
    vec3 position[64];  
    vec4 orientation[64];  
} Skeleton;

インデックスを取得するコードは次のとおりです。

const GLchar* uniformNames[2] =
{
    "SkeletonBlock.position",
    "SkeletonBlock.orientation"
};

GLuint uniformIndex[2];
glGetUniformIndices(shaderProgram, 2, uniformNames, uniformIndex);

何らかの理由で、この呼び出しは非常に高いインデックス (常に 4294967295) を示していますが、その理由はわかりません。明らかな何かが欠けているように感じます。OpenGL は 1 つのアクティブな均一ブロックを報告していますが、これは正しいもので、最大許容数は 15 です。コードのこのセクションの前後にエラー フラグはアクティブではありません。それがうまくいかない可能性のある提案はありますか?

4

3 に答える 3

2
layout(std140) uniform SkeletonBlock  
{  
    vec3 position[64];  
    vec4 orientation[64];  
} Skeleton;

この定義の読み方は次のとおりです。

  • という名前の均一なブロックがありSkeletonBlockます。
  • これには、と呼ばれる64の配列が含まvec3position、その後にと呼ばれる64vec4の配列が続きorientationます。
  • そのすべてのメンバーの名前は、GLSLでは識別子によって修飾されますSkeleton

最後の部分に注意してください。GLSLでは、GLSLでのみposition配列は。で識別されSkeleton.positionます。C ++では、配列はまたはのいずれかで識別されSkeletonBlock.positionますSkeletonBlock.position[0]。ここでのポイントは、C ++コード SkeletonBlockでは、インスタンス名ではなく、ブロック名をプレフィックスとして使用することですSkeleton

SkeletonBlockブロックには、照会できるインデックスがあります(glGetUniformBlockIndex「ブロック」という単語の使用と、「インデックス」に複数がないことに注意してください)。個々のユニフォームメンバーにもインデックスがありますが、それらはユニフォームのリストへのインデックスです。また、これらの変数には正しく名前を付ける必要があります。ユニフォームブロックにインスタンス名がある場合、ユニフォームブロックメンバーの前には、インスタンス名ではなくブロック名を付ける必要があります。

これらの名前をOpenGL関数に渡していて、有効なインデックスを取得していない場合は、ドライバーのバグがある可能性があります。

于 2012-01-20T07:00:43.667 に答える
1

私はあなたが望むと信じています

const GLchar* uniformNames[2] =
{
    "Skeleton.position",
    "Skeleton.orientation"
};

uniform SkeletonBlockC スタイル言語 (GLSL など) のセマンティクスにあるように、という名前の型の変数を宣言していますSkeleton。したがって、は、必要な場所"SkeletonBlock.position"の形式です。<typename>.<member><variable>.<member>

OpenGL のドキュメントによると、悪い統一名を付けるとGL_INVALID_INDEXfromが取得されます。glGetUniformIndices()これに対して、返された各インデックスをチェックするのが賢明かもしれません。私はそれを賭けGL_INVALID_INDEX == -1ます。

また、この数値 4294967295 は、32 ビットの -1 (2 の補数) の符号なし解釈です。

于 2012-01-10T17:06:23.310 に答える
0

シェーダの GLSL ソース コードで均一なブロック変数が参照されていない (つまり、使用されていない) 場合、おそらくこれが発生します。シェーダー ソース コード コンパイラは、最適化としてシェーダーから変数を完全に削除します。その後、 を呼び出すglGetUniformIndicesと GL_INVALID_INDEX が返されます。

于 2015-12-21T10:56:49.777 に答える