【问题标题】:OpenGL z value. Why negative value in front?OpenGL z 值。为什么前面是负值?
【发布时间】:2018-06-03 22:16:17
【问题描述】:

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 平移顶点,则此平移的行为应如此。对象变得更远。

【问题讨论】:

  • 如何设置 VAO?
  • @ybungalobill 我使用 GLFW_OPENGL_COMPAT_PROFILE 模式,我不使用任何 VAO。
  • @Rabbid76 我不翻译时不使用投影矩阵和视图矩阵。当我通过 z=-3 平移顶点时,我只使用模型和投影矩阵。投影矩阵:glm::mat4 projectionMatrix = glm::perspective<float>(glm::radians(60.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 10.0f); 模型矩阵:glm::mat4 modelProjectionMatrix = glm::translate(projectionMatrix, glm::vec3(0.0f, 0.0f, -6.0f));

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


【解决方案1】:

为什么三角形 1 在前面?三角形 2 应该在前面,因为 0.0f > -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);
}

【讨论】:

  • 谢谢,一切都适用于模型、视图和投影矩阵。在哪里可以找到 OpenGL 使用的默认视图和投影矩阵(当我没有指定时)?我在哪里可以找到“在标准化设备空间中,z 轴指向视口”? 0.0f 究竟是如何变得小于 -1.0f 的?
  • 谢谢,您对单位矩阵的看法是正确的。我还有另一个问题需要更好地理解。这就是正交投影矩阵link 的外观。我无法理解 farnear 值。如果(-2)/(f-n)=1,则表示f=-1n=1。如果我们再看glm::ortho,每个人都将near 值小于far。为什么在我的情况下 f 小于 n
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2018-01-29
  • 2020-04-01
  • 1970-01-01
相关资源
最近更新 更多