2

を使用してシェーダー コードで頂点属性の位置を指定する場合、C++ プログラムでlayout(location = ...)を使用して位置をフェッチする必要はありません。glGetAttribLocation

レイアウト修飾子を使用してシェーダーで位置を定義したり、C++ プログラムでそれらを取得したりしない場合、それらは自動的に割り当てられます。質問は、この自動割り当てについてです。この順序は、シェーダー コードでの定義の順序と同じですか?

たとえば、最初のシェーダー コードでは、位置が 2 番目のシェーダー コードと同じであることが保証されていますか?

// first shader code
#version 330

in vec3 position;
in vec3 normal;
in vec2 texcoord;


// second shader code
#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texcoord;

また、フラグメント シェーダーの出力にも同じ規則が適用されますか? 今のところ、私はglBindFragDataLocationそれらを取得するために使用します。

4

3 に答える 3

3

自動属性割り当ては任意です。それらは、実装が選択するアルゴリズムに従います。

属性の場所を割り当てていない場合は、それについて何も推測できません。

于 2013-03-05T17:57:59.510 に答える
2

layoutいいえ -- 私が知っている少なくとも 1 つのドライバーは、属性に明示的なディレクティブがない場合、場所を割り当てる前に属性をアルファベット順に並べ替えます。さらに、プログラムで使用されていない属性は、ほぼ確実に除外され、場所が割り当てられません。

于 2013-03-05T17:44:58.153 に答える
1

デバッガーを使用して、属性に割り当てられた値を見つけることができます。

positionAttribute = glGetAttribLocation(shaderProgram, "position");
于 2013-03-06T18:01:45.087 に答える