2

我在正射投影中有一个带有固定相机的代码(游戏)。它运行平稳,直到我将相机位置从 更改(0,0,1)(0,0,-1)

简而言之,我有 2 个纹理:

{    //texture 1               
     960.0f,     0.0f,   -5.0f,    0.0f,   0.0f,      
     960.0f,  1080.0f,   -5.0f,    1.0f,   0.0f,      
    1920.0f,     0.0f,   -5.0f,    0.0f,   1.0f,    
    1920.0f,  1080.0f,   -5.0f,    1.0f,   1.0f      
}

{   // texture 2                        
    1290.0f,   390.0f,   -7.0f,    0.0f,   0.0f,    
    1290.0f,   690.0f,   -7.0f,    1.0f,   0.0f,    
    1590.0f,   390.0f,   -7.0f,    0.0f,   1.0f,    
    1590.0f,   690.0f,   -7.0f,    1.0f,   1.0f      
}

变换矩阵:

view = glm::lookAt
    (           
    glm::vec3(  0.0f,  0.0f,  1.0f  ),   
    glm::vec3(  0.0f,  0.0f,  0.0f  ),
    glm::vec3(  0.0f,  1.0f,  0.0f  )
    );

projection = glm::ortho
    (
    0.0f,   
    1920.0f,
    0.0f, 
    1080.0f,
    1.0f,   // zNear
    10.0f   // zFar
    );

顶点着色器:

#version 330 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4( aPos, 1.0 );

    TexCoord = vec2( aTexCoord.x, aTexCoord.y );
}

如果我运行此代码,它会正确显示两种纹理,进行深度测试,...

但是,如果我将相机位置更改为(0, 0, -1)并将纹理的 Z 坐标更改为它们的逆+5+7,并保持相同的方向(0, 0, 0),则不会显示(渲染)纹理。它不应该显示与更改之前相同吗?

4

1 回答 1

3

该问题与正交投影矩阵有关,因为它没有居中。当视图的 z 轴倒置时,x 轴也倒置。请注意,右手定则仍需满足,x.axis 是 y 轴和 z 轴的叉积。

当几何图形在z-5且视图和投影矩阵如下

 view = glm::lookAt(
     glm::vec3(0.0f, 0.0f, 1.0f),
     glm::vec3(0.0f, 0.0f, 0.0f),
     glm::vec3(0.0f, 1.0f, 0.0f);
 projection = glm::ortho(0.0f, 1920.0f, 0.0f, 1080.0f, 1.0f, 10.0f);

然后对象被投影到视口:

但是如果你切换几何和视图的z位置,那么你会得到以下情况:

 view = glm::lookAt(
     glm::vec3(0.0f, 0.0f, -1.0f),
     glm::vec3(0.0f, 0.0f, 0.0f),
     glm::vec3(0.0f, 1.0f, 0.0f);

然后对象在视口旁边:

沿 X 轴移动正交投影,以解决您的问题:

projection = glm::ortho(-1920.0f, 0.0f, 0.0f, 1080.0f, 1.0f, 10.0f);
于 2019-03-08T22:48:03.853 回答