-1

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

4

1 に答える 1

1

次に、C++ OpenGL 呼び出しで、エントリが (行優先順で格納されている) 行列を送信します。

それは行優先の順序ではありません。それは列優先順です。

次の 4x3 行列があるとします。

1  4  7  10
2  5  8  11
3  6  9  12

これは、列優先順でこのデータの C++ 配列がどのように見えるかです。

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

それがあなたのデータです。スペースは自由に挿入してください。それはまったく無関係です。

行優先順の同じデータは次のようになります。

{1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12}

4x3 行列のデータを転置する際に発生した特定の問題については、単にドライバーのバグである可能性があります。

于 2011-10-05T08:31:39.967 に答える