Что должно произойти с флагом транспонирования для glUniformMatrix с неквадратными матрицами? - PullRequest
0 голосов
/ 05 октября 2011

Я столкнулся с тем, что мне показалось странным, используя 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-я строка моих данных отсутствует.

Есть ли разумная причина для этого?Я ничего не нахожу в spec (s2.1 p82).

GL_VERSION: 2.1 NVIDIA-1.6.36 GL_SHADING_LANGUAGE_VERSION: 1.20

1 Ответ

1 голос
/ 05 октября 2011

Затем в моем вызове 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, это можетпросто будьте ошибкой водителя.

...