Допустим, у меня есть следующий код вершинного шейдера:
attribute vec4 vPos;
uniform mat4 MVP;
uniform mat4 LookAt;
void main{
gl_Position = MVP * vPos;
}
Как я могу использовать LookAt
матрица в этом шейдере для позиционирования глазка камеры? я пытался LookAt * MVP * vPos
но это не сработало, так как мой треугольник просто исчез за кадром!
Я бы предложил переместить LookAt за пределы шейдера, чтобы избежать ненужных вычислений для каждой вершины. Шейдер еще сделаю
gl_Position = MVP * vPos;
и вы управляете MVP в приложении с помощью GLM. Например:
projection = glm::perspective(fov, aspect, 0.1f, 10000.0f);
view = glm::lookAt(eye, center, up);
model = matrix of the model, with all the dynamic transforms.
MVP = projection * view * model;
LookAt
матрица в целом называется View
матрица и соединяется с матрицей преобразования модель-в-мире, чтобы сформировать WorldView
матрица. Затем это умножается на проекционную матрицу, которая часто является ортогональной или перспективной. Позиции вершин в пространстве модели умножаются на результирующую матрицу, чтобы быть преобразованными в пространство клипа (вроде … Я пропустил здесь пару шагов, которые вам не нужно делать, и выполняется аппаратным обеспечением / драйвером).
В вашем случае убедитесь, что вы используете правильные «руки» для ваших преобразований. Также вы можете попробовать умножить позицию в обратном порядке с транспонированием ваших матриц преобразования, например, так vPos*T_MVP*T_LookAt
,