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