Как использовать матрицу LookAt в вершинном шейдере

Допустим, у меня есть следующий код вершинного шейдера:

attribute vec4 vPos;
uniform mat4 MVP;
uniform mat4 LookAt;

void main{
gl_Position = MVP * vPos;
}

Как я могу использовать LookAt матрица в этом шейдере для позиционирования глазка камеры? я пытался LookAt * MVP * vPos но это не сработало, так как мой треугольник просто исчез за кадром!

0

Решение

Я бы предложил переместить 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;
1

Другие решения

LookAt матрица в целом называется View матрица и соединяется с матрицей преобразования модель-в-мире, чтобы сформировать WorldView матрица. Затем это умножается на проекционную матрицу, которая часто является ортогональной или перспективной. Позиции вершин в пространстве модели умножаются на результирующую матрицу, чтобы быть преобразованными в пространство клипа (вроде … Я пропустил здесь пару шагов, которые вам не нужно делать, и выполняется аппаратным обеспечением / драйвером).

В вашем случае убедитесь, что вы используете правильные «руки» для ваших преобразований. Также вы можете попробовать умножить позицию в обратном порядке с транспонированием ваших матриц преобразования, например, так vPos*T_MVP*T_LookAt,

1

По вопросам рекламы [email protected]