Когда я использую перспективную проекцию в OpenGL, моя ось X инвертируется, как показано на изображении ниже. Приведенный ниже код может быть недействительным, потому что я сильно изменил его, чтобы сделать его менее неясным. Это может не сработать, так что имейте это в виду. Вот код и вершины:
typedef struct{
float x;
float y;
float z;
} vertex_t;
glm::vec3 position = glm::vec3(0, 0, 0);
glm::vec3 look_at = glm::vec3(0, 0, 1);
glm::mat4 projectionMatrix = glm::perspective(45.0f, (float)800 / (float)600, 0.1f, 100.f);
glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 5.0f));
glm::mat4 viewMatrix = glm::lookAt(
position,
look_at,
glm::vec3(0, 1, 0)
);
vertex_t data[3] = {
{-0.5, 0.5, -0.5f},
{ 0.5, 0.5, -0.5f},
{-0.5, -0.5, -0.5f},
};
unsigned int indices[3] = {
0, 1, 2
};
glm::mat4 mvp = projectionMatrix * viewMatrix * modelMatrix; //This is passed in as the uniform u_MVP later
Это вершинный шейдер:
#version 330 core
layout(location = 0) in vec4 position;
uniform mat4 u_MVP;
void main(){
gl_Position = u_MVP * position;
}
И это выход. Как видите, он не соответствует предоставленным вершинам.
Если вам нужен весь код или вы хотите, чтобы я предоставил исходную версию, дайте мне знать. Спасибо!
ОБНОВЛЕНИЕ: я пробовал использовать отрицательную ось Z, и это не сработало. Вот код:
position = glm::vec3(0, 0, 0);
look_at = glm::vec3(0, 0, -1);
glm::mat4 projectionMatrix = glm::perspective(45.0f, (float)800 / (float)600, 0.1f, 100.f);
glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
viewMatrix = glm::lookAt(
position,
look_at,
glm::vec3(0, 1, 0) // Tilt/rotation (unclear) set y to -1 for upside down view
);
position
какvec4
, возможно, стоит проверить. Сделайте егоvec3
в шейдере и измените calc наu_MVP * vec4(position, 1.0)
и посмотрите, изменит ли это что-нибудь. Редактировать: и то, что вы говорите, не имеет ничего общего с LHS/RHS. Разница заключается только в направлении, в котором указывает ось Z. - person Beko   schedule 28.11.2020