我试图了解如何使用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轴指向屏幕,而不是它。
有人可以更有经验请解释我错过的基本方面吗?
P.S。没有GLUT,没有GLM,没有调用设置各种OpenGL矩阵。只有“将顶点传递给GPU - 启用着色器程序 - 绘制事物”
答案 0 :(得分:2)
网络上的所有教程都说OpenGL使用右手坐标系,而Z轴指向“屏幕外”#。
这只是一个惯例 - 而且这个惯例在这里并不适用,因为它是眼睛空间的惯例。通常情况下,你有一些眼睛空间,相机沿着-z方向看(并且gluLookAt()
功能正是为此而设计的)。
典型的投影矩阵也会将手性作为副作用翻转。并且gluPerspective()
,glOrtho()
和glFrustum()
函数实际上希望您为near
和far
参数设置正值,但将近和远平面设置为分别为z=-near
和z=-far
。因此,GL的剪辑空间通常被认为是左撇子。由于不使用转换矩阵,因此直接在剪辑空间中绘制。
然而,这只是另一个惯例,如果你真的想要它可以改变。您可以翻转深度测试功能,也可以使用glDepthRange()
翻转它。最后,这完全取决于你。但通常,人们坚持使用GL惯例和左手剪辑空间,NDC和窗口空间。实际上,在窗口坐标中,z = 0处的近平面和z = 1处的远平面非常直观。