glUniformMatrix4x3fv を使用すると、奇妙な動作と思われるものに遭遇しました。具体的には、転置フラグに関して TRUE を指定すると、行列の行全体がシェーダー変数にありません (そのため、そこにある行は順不同です)。
例えば。GLSL シェーダーにあるとします。
mat4x3 T[m];
次に、C++ OpenGL 呼び出しで、エントリが (行優先順で格納されている) 行列を送信します。
T =
1 2 3
4 5 6
7 8 9
10 11 12
101 102 103
104 105 106
107 108 109
110 111 112
101 102 103
204 205 206
207 208 209
210 211 212
...
そして私は電話する
glUniformMatrix4x3fv(location,m,false,T);
次に、各マトリックスが次のように正しく出力されることをシェーダーで確認します。
T[0] ->
1 4 7 10
2 5 8 11
3 6 9 12
T[1] ->
101 104 107 110
102 105 108 111
103 106 109 112
...
しかし、行列を C++ 側に (再び行優先順で) 格納すると、次のようになります。
T =
1 4 7 10
2 5 8 11
3 6 9 12
101 104 107 110
102 105 108 111
103 106 109 112
201 204 207 210
202 205 208 211
203 206 209 212
...
そして、次のように転置フラグを TRUE として使用してみてください。
glUniformMatrix4x3fv(location,m,true,T);
次に、私のシェーダーでは、行列が次のように正しく表示されません。
T[0] ->
1 4 7 10
2 5 8 11
3 6 9 12
T[1] ->
102 105 108 111
103 106 109 112
201 204 207 210
T[2] ->
203 206 209 212
301 304 307 310
302 305 308 311
...
データの 4 行ごとに欠落しています。
これには合理的な理由がありますか?仕様には何も見つかりません(s2.1 p82)。
GL_VERSION: 2.1 NVIDIA-1.6.36 GL_SHADING_LANGUAGE_VERSION: 1.20