从正交投影切换到透视投影

问题描述 投票:0回答:1

我正在尝试为现有引擎添加视差效果。到目前为止,引擎工作时都是正交投影。对象放置在屏幕上的像素坐标中。问题是我无法弄清楚如何使用透视投影矩阵等复制相同的投影。我可以为深度添加一个Z坐标。

我已经尝试了矩阵和z坐标的各种组合,结果始终是黑屏。

我要替换的矩阵:

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(1280.0f), static_cast<GLfloat>(720.0f), 0.0f, 0.0f, -100.0f);

顶点着色器:

// Shader code (I tested this while having identity matrices for view and model

#version 330 core

layout (location = 0) in vec2 vertex;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main() {
    gl_Position = projection * view * model * vec4(vertex.xy, 1.0f, 1.0f);
}

我认为投影代码可能有效:

    glm::mat4 model = glm::mat4(1.0f);
    model = glm::translate(model, glm::vec3(-640, -310.0f, 0.0f));
    model = glm::scale(model, glm::vec3(1.0f / 1280.0f, 1.0f / 720.0f, 1.0f));

    glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 0.0f);
    glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
    glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
    glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp); 
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, -100.0f);

预计矩形仍会显示在相似的位置(一旦工作,我可以纠正细节)而不会出现黑屏。

c++ opengl glsl glm-math
1个回答
0
投票

Perspective projection矩阵的规范是错误的。

glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, -100.0f);

glm::perspective通过沿y轴的视场角,纵横比以及到近平面和远平面的距离来定义glm::perspective。因此,近平面和远平面必须为正值(> 0),近平面必须小于远平面:

Viewing frustum

例如:

0 < near < far

几何图形必须位于近平面和远平面之间,否则将被裁剪。透视投影处的深度与大小的比率是线性的,可以计算。它取决于视角范围:

glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f);
#define _USE_MATH_DEFINES
#include <math.h>

float fov_y = glm::radians(45.0f); float ratio_size_per_depth = atan(glm::radians(fov_y / 2.0f) * 2.0f;

注意,如果一个对象在视口上的投影中显示的大小为原来的一半,则该对象到相机的距离(深度)必须加倍。

© www.soinside.com 2019 - 2024. All rights reserved.