1

我试图了解如何使用 OpenGL 绘制对象。问题很简单,但我仍然无法在任何地方找到明确的答案(或者我完全愚蠢:))。让我描述一下这个问题。

1)我只是在屏幕上放了 2 个三角形。三角形的坐标(x,y,z,w)如下:

Triag1 = { {0, 0, -0.5, 1} , {1, 0, -0.5, 1}, {0, 1, -0.5, 1} } // a bigger one
Triag2 = { {0, 0, 0.5, 1} , {0.5, 0, 0.5, 1}, {0, 0.5, 0.5, 1} } // a smaller one

2)我没有使用也不查看,也没有投影变换

3)我将每个三角形的“默认”颜色作为顶点属性之一传递,并使用变量将它们简单地绕过到片段着色器。Triag1 为蓝色,Triag2 为红色

网络上的所有教程都说OpenGL使用右手坐标系并且Z轴指向“屏幕外”。因此,考虑到我的对象各自的 z 坐标,我希望在它后面看到一个较小的红色三角形和一个较大的蓝色三角形。怎么从来没有发生过。我只能看到一个大胖蓝色三角形。

如果我交换我的三角形各自的 z 坐标(Triag1 得到正 z 坐标,Triag2 得到负 z 坐标)我会看到我期望看到的。但。这意味着 Z 轴以某种方式指向屏幕,而不是在屏幕之外。

有经验的人可以解释一下我错过了什么基本方面吗?

PS 没有 GLUT,没有 GLM,没有调用设置各种 OpenGL 矩阵。仅“将顶点传递给 GPU - 启用着色器程序 - 绘制事物”

4

1 回答 1

2

网络上的所有教程都说OpenGL使用右手坐标系并且Z轴指向“屏幕外”。

这只是一个约定——而且一个在这里并不适用的约定,因为那是眼睛空间的约定。通常,您有一些眼睛空间,相机沿着 -z 方向看(并且该gluLookAt()功能的设计正是考虑到这一点)。

典型的投影矩阵也会将手性翻转作为副作用。而gluPerspective(),glOrtho()和函数实际上希望您为和参数glFrustum()指定正值,但将近平面和远平面分别设置为和。因此,GL 的剪辑空间通常被认为是左撇子。由于您不使用转换矩阵,因此您直接在剪辑空间中绘制。nearfarz=-nearz=-far

但是,这只是另一个约定,如果您真的愿意,可以更改它。您可以翻转深度测试功能,也可以使用glDepthRange(). 最后,这一切都取决于你。但通常,人们坚持使用 GL 约定和左手剪辑空间、NDC 和窗口空间。在窗口坐标中,z=0 的近平面和 z=1 的远平面实际上是非常直观的。

于 2014-09-13T22:00:50.543 回答