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

时间:2018-06-03 22:16:18

标签: opengl coordinate-systems vertex coordinate-transformation vertices

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

右手坐标系
right-hand coordinate system

我绘制了两个三角形:

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。 -1.0F。

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

之后,如果我在顶点着色器中将顶点转换为z = -3,则此平移的行为应该如此。对象变得更进一步。

1 个答案:

答案 0 :(得分:1)

  

为什么三角形1在前面?三角形2应该在前面,因为0.0f> 1。 -1.0F。
  我在顶点着色器中只有gl_Position = vec4(aPos, 1.0);

当然红色三角形位于蓝色三角形的前面,因为您不使用任何投影矩阵。在将顶点坐标指定给gl_Position之前,您忘记使用投影矩阵变换输入顶点。

这导致顶点等于标准化的设备空间坐标。在规范化的设备空间中,z轴指向视口,“投影”是正交而非透视。

你必须做这样的事情:

in vec3 aPos;
mat4 modelProjectionMatrix;

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