透视投影在OpenGL中不起作用
我正在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
#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°的开启角度。使用此投影,立方体看起来与它应该的样子完全相同。要解决深度顺序问题,请启用深度测试。