OpenGL z 值。为什么前面是负值?

OpenGL z value. Why negative value in front?

Opengl 有右手坐标系。这意味着 z 值向我增加。

右手坐标系

我画了两个三角形:

float vertices[] =
{
     //position                     //color
     //triangle 1
     0.0f,  1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//0
    -1.0f, -1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//1
     1.0f, -1.0f, -1.0f,            1.0f, 0.0f, 0.0f,//2
     //triangle 2
     0.0f, -1.0f, 0.0f,             0.0f, 0.0f, 1.0f,//3
     1.0f,  1.0f, 0.0f,             0.0f, 0.0f, 1.0f,//4
    -1.0f,  1.0f, 0.0f,             0.0f, 0.0f, 1.0f//5
};

为什么三角形1在前面?三角形 2 应该在前面,因为 0.0f > -1.0f.

我在顶点着色器中只有gl_Position = vec4(aPos, 1.0);

之后,如果我在顶点着色器中将顶点转换为 z=-3,则此转换会正常运行。对象变得更远。

Why triangle 1 is in front? Triangle 2 should be in front, because of 0.0f > -1.0f.
I have only gl_Position = vec4(aPos, 1.0); in vertex shader.

当然红色三角形在蓝色三角形前面,因为你没有使用任何投影矩阵。在将顶点坐标分配给 gl_Position.

之前,您忘记了通过投影矩阵变换输入顶点

这导致顶点等于标准化设备 space 坐标。在标准化设备 space 中,z 轴指向视口并且 "projection" 是正交的而不是透视图。

你必须这样做:

in vec3 aPos;
mat4 modelProjectionMatrix;

void main()
{
    gl_Position = modelProjectionMatrix * vec4(aPos, 1.0);
}