透视投影在OpenGL中不起作用

时间:2017-02-04 19:12:24

标签: 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 + 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;

}

ret

结果很奇怪。似乎显示了除了正面之外的五个面,它们都应该消失。背面现在位于正面的前面。这是正面的两个三角形:

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。为什么结果如此奇怪?

1 个答案:

答案 0 :(得分:0)

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

ret

我知道我现在做错了什么。

首先,我创建的窗口没有深度缓冲区,我没有启用深度测试。由于正面之外的五个面的数据被加载到正面之后,它们都被绘制了

第二,(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,因此正面将显示在其他面之前。