2015-06-01 7 views
0

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

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

void main{ 
    gl_Position = MVP * vPos; 
} 

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

ответ

1

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

Да, я делаю MVP за пределами шейдера, но для иллюстрации я поместил матрицу LookAt в шейдер: D Это было очень четкое объяснение с примером кодирования, которое было тем, чем я был после - спасибо! – CodingNinja

1

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

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

+0

Как я могу определить ручность? – CodingNinja

+0

смотрите в документации GL. OpenGL имеет право вообще и DirectX левый. – rashmatash

+0

так что если это было правша, я должен использовать 'Projection * View * Model' ?? – CodingNinja

 Смежные вопросы

  • Нет связанных вопросов^_^