透视投影在OpenGL中不起作用

透视投影在OpenGL中不起作用,opengl,Opengl,我正在opengl中显示一个立方体。这是我的顶点着色器文件 #version 330 layout(location = 0) in vec4 position; layout(location = 1) in vec4 color; smooth out vec4 theColor; uniform vec3 offset; uniform mat4 perspectiveMatrix; void main() { vec4 cameraPos = position + vec

我正在opengl中显示一个立方体。这是我的顶点着色器文件

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;

smooth out vec4 theColor;

uniform vec3 offset;
uniform mat4 perspectiveMatrix;

void main()
{
    vec4 cameraPos = position + vec4(offset.x, offset.y, offset.z, 0.0);

    //gl_Position = perspectiveMatrix * cameraPos;
    gl_Position.xy = cameraPos.xy;
    gl_Position.z = cameraPos.z*2.0f + 3.0f;
    gl_Position.w = -cameraPos.z;

    float tmp = gl_Position.z / gl_Position.w;
    theColor = color;

}
结果很奇怪,除了前面的那五个面,似乎都显示出来了,应该都消失了。后面现在在前面的前面。下面是前面的两个三角形:

0.25f,  0.25f, -1.0f, 1.0f,
0.25f, -0.25f, -1.0f, 1.0f,
-0.25f,  0.25f, -1.0f, 1.0f,

 0.25f, -0.25f, -1.0f, 1.0f,
-0.25f, -0.25f, -1.0f, 1.0f,
-0.25f,  0.25f, -1.0f, 1.0f,
背面的数据:

0.25f,  0.25f, -3.0f, 1.0f,
-0.25f,  0.25f, -3.0f, 1.0f,
0.25f, -0.25f, -3.0f, 1.0f,

0.25f, -0.25f, -3.0f, 1.0f,
-0.25f,  0.25f, -3.0f, 1.0f,
-0.25f, -0.25f, -3.0f, 1.0f,
我分别为近平面和远平面选择-1.0f和3.0f,因此 n+f/f-n=2.0f和
2*n*f/f-n=3.0f。为什么结果如此奇怪?

经过一些测试,我得到了正确的图像

我知道我现在做错了什么

首先,我创建的窗口没有深度缓冲区,并且我没有启用深度测试。由于前面之外的五个面的数据都是在前面加载的,所以它们都被绘制出来

第二,n+f/f-n和2*n*f/f-n应该更改为n+f/f-n和2*n*f/f-n

Why the negations? OpenGL wants to present to the programmer a  
right-handed coordinate system before projection and left-handed 
coordinate system after projection.
这就是我发现的信息。在窗口空间中,较大的z值最终会变为较小的z值,这正是深度值。
由于glDepthFunc的默认值为GL_LESS,因此前面的面将显示在其他面之前。

1您为其余参数选择了什么?“近”和“远”不是透视投影的唯一参数。2如果你看到前面的背面:你启用深度测试了吗?这是项目。我想我只有近距离和远距离参数。我只保留x和y坐标,当它们除以w时,它们在[-1,1]范围内。经过一些计算,我发现0.25f,0.25f,-1.0f,1.0f->0.250.251和0.25f,0.25f,-3.0f,1.0f,->0.083 0.083-1我不启用深度测试。将矩阵的元素[0][0]和[1][1]设置为1会给您一个非常奇怪的视野。例如,由于[1][1]被定义为cotfov/2,因此fov为PI,这意味着您的相机具有180°的开启角度。使用此投影,立方体看起来与它应该的样子完全相同。要解决深度顺序问题,请启用深度测试。