OpenGL Projection Matrix显示正交

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

我有一个正交相机工作,但我想尝试实现透视相机,所以我可以在以后做一些视差效果。我在尝试实现它时遇到了一些问题。看起来深度不正常。我正在沿着x轴旋转一个2D图像来模拟它稍微向下铺设,所以我看到投影矩阵工作。尽管如此,它仍然显示为正交视角。

这是我的一些代码:

CameraPersp::CameraPersp() :
    _camPos(0.0f,0.0f,0.0f), _modelMatrix(1.0f), _viewMatrix(1.0f), _projectionMatrix(1.0f)

函数叫init来设置矩阵变量:

void CameraPersp::init(int screenWidth, int screenHeight)
{
    _screenHeight = screenHeight;
    _screenWidth = screenWidth;

    _modelMatrix = glm::translate(_modelMatrix, glm::vec3(0.0f, 0.0f, 0.0f));
    _modelMatrix = glm::rotate(_modelMatrix, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
    _viewMatrix = glm::translate(_viewMatrix, glm::vec3(0.0f, 0.0f, -3.0f));
    _projectionMatrix = glm::perspective(glm::radians(45.0f), static_cast<float>(_screenWidth) / _screenHeight, 0.1f, 100.0f);
}

使用x,y,z,width,height,src初始化要加载的纹理

_sprites.back()->init(-0.5f, -0.5f, 0.0f, 1.0f, 1.0f, "src/content/sprites/DungeonCrawlStoneSoupFull/monster/deep_elf_death_mage.png");

在矩阵中发送到vertexShader:

    GLint mLocation = _colorProgram.getUniformLocation("M");
    glm::mat4 mMatrix = _camera.getMMatrix();
    //glUniformMatrix4fv(mLocation, 1, GL_FALSE, &(mMatrix[0][0]));
    glUniformMatrix4fv(mLocation, 1, GL_FALSE, glm::value_ptr(mMatrix));

    GLint vLocation = _colorProgram.getUniformLocation("V");
    glm::mat4 vMatrix = _camera.getVMatrix();
    //glUniformMatrix4fv(vLocation, 1, GL_FALSE, &(vMatrix[0][0]));
    glUniformMatrix4fv(vLocation, 1, GL_FALSE, glm::value_ptr(vMatrix));

    GLint pLocation = _colorProgram.getUniformLocation("P");
    glm::mat4 pMatrix = _camera.getPMatrix();
    //glUniformMatrix4fv(pLocation, 1, GL_FALSE, &(pMatrix[0][0]));
    glUniformMatrix4fv(pLocation, 1, GL_FALSE, glm::value_ptr(pMatrix));

这是我的顶点着色器:

#version 460
//The vertex shader operates on each vertex

//input data from VBO. Each vertex is 2 floats
in vec3 vertexPosition;
in vec4 vertexColor;
in vec2 vertexUV;

out vec3 fragPosition;
out vec4 fragColor;
out vec2 fragUV;

//uniform mat4 MVP;
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;

void main() {
    //Set the x,y position on the screen
    //gl_Position.xy = vertexPosition;
    gl_Position = M * V * P * vec4(vertexPosition, 1.0);

    //the z position is zero since we are 2d
    //gl_Position.z = 0.0;

    //indicate that the coordinates are nomalized
    gl_Position.w = 1.0;

   fragPosition = vertexPosition;
   fragColor = vertexColor;
   // opengl needs to flip the coordinates
   fragUV = vec2(vertexUV.x, 1.0 - vertexUV.y);
}

我可以看到图像“压扁”一点,因为它仍然将透视渲染为正交。如果我在x轴上移除旋转,它就不再被压扁,因为它根本没有放下。对我做错了什么的想法?我可以根据要求提供更多信息,但我认为我放入了大部分内容。

图片:

Projection Matrix showing as Orthographic

c++ opengl matrix projection glm-math
1个回答
1
投票

你不应该修改gl_Position.w

    gl_Position = M * V * P * vec4(vertexPosition, 1.0); // gl_Position is good

    //indicate that the coordinates are nomalized < not true
    gl_Position.w = 1.0; // Now perspective divisor is lost, projection isn't correct
© www.soinside.com 2019 - 2024. All rights reserved.