Использование главного ряда в шейдере OpenGL
Я видел это наСайт OpenGL:
Переменные атрибутов OpenGL Shading Language могут иметь тип mat2, mat3 или mat4. Атрибуты этих типов могут быть загружены с использованием точек входа glVertexAttrib. Матрицы должны быть загружены в последовательные слоты универсального атрибута в главном порядке столбцов, с одним столбцом матрицы в каждом слоте универсального атрибута.
Я последовательно использую векторную библиотеку, основанную на мажоре строк. То есть 16 элементов матрицы 4х4 расположены следующим образом в структуре:
vec4 x;
vec4 y;
vec4 z;
vec4 w;
Где каждыйvec4
имеет компонентыx, y, z, w
, Таким образомлинейный порядок содержимого является главной строкой, поскольку первая строка занимает первые 4 позиции в памяти, и математическая матрица обрабатывается как таковая, например, это преобразование поворота:
static Matrix4<T> RotateZ(T degrees)
{
T radians = degrees * 3.14159f / 180.0f;
T s = std::sin(radians);
T c = std::cos(radians);
Matrix4 m;
m.x.x = c; m.x.y = s; m.x.z = 0; m.x.w = 0;
m.y.x = -s; m.y.y = c; m.y.z = 0; m.y.w = 0;
m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1;
return m;
}
Библиотека является основной строкой для поддержки вычислений слева направо при написании кода на стороне клиента, что естественно для многих программистов. Но что я не понимаю, так это то, что эти матрицы основных строк передаются в шейдеры «как есть», которые в соответствии с вышеизложенным ожидают основной столбец.
Я понимаю, что шейдер выполняет вычисления справа налево. Но не следует ли транспонировать матрицу строк-мажоров, чтобы она была главной-колонкой перед передачей в шейдер? Я этим не занимался, но все работает просто отлично.