我正在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。为什么结果如此奇怪?
答案 0 :(得分:0)
经过一些测试,我得到了正确的图像。
我知道我现在做错了什么。
首先,我创建的窗口没有深度缓冲区,我没有启用深度测试。由于正面之外的五个面的数据被加载到正面之后,它们都被绘制了
第二,(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,因此正面将显示在其他面之前。