OpenGL以像素为单位定义顶点位置

24 c++ opengl

我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在我学习的过程中学习一切.我仍然对定义顶点及其"位置"感到困惑.也就是说,我仍然试图理解OpenGL的顶点到像素转换机制.可以简单解释一下,或者有人指出一篇文章或其他可以解释这一点的内容.谢谢!

Chr*_*ica 27

这是相当基本的知识,您最喜欢的OpenGL学习资源应该教您作为第一件事之一.但无论如何标准的OpenGL管道如下:

  1. 顶点位置从对象空间(局部到某个对象)转换为世界空间(相对于某些全局坐标系).此转换指定您的对象(顶点所属的对象)在世界中的位置

  2. 现在,世界空间位置转变为相机/视野.此变换由您通过其观看场景的虚拟摄像机的位置和方向确定.在OpenGL中,这两个转换实际上组合成一个模型视图矩阵,它直接将顶点从对象空间转换为视图空间.

  3. 接下来应用投影变换.虽然模型视图变换应仅包括仿射变换(旋转,平移,缩放),但投影变换可以是透视变换,其基本上扭曲对象以实现真实的透视图(远离的对象更小).但在你的2D视图的情况下,它可能是一个正交投影,只做翻译和缩放.该变换由OpenGL通过投影矩阵表示.

  4. 在这3个(或2个)变换之后(然后通过w分量进行透视分割,实际上实现了透视变形,如果有的话)你所拥有的是标准化的设备坐标.这意味着在这些变换之后,可见对象的坐标应该在该范围内[-1,1].超出此范围的所有东西都被剪掉了.

  5. 在最后一步中,应用视口变换,并将坐标从[-1,1]范围转换为[0,w]x[0,h]x[0,1]立方体(假设glViewport(0, w, 0, h)调用),它们是帧缓冲区中的顶点'最终位置,因此也就是其像素坐标.

使用顶点着色器时,步骤1到3实际上是在着色器中完成的,因此可以以您喜欢的任何方式完成,但通常也符合此标准模型视图 - >投影管道.

要记住的主要事情是,在模型视图和投影变换后,每个顶点[-1,1]都会被范围外的坐标剪掉.因此,[-1,1]-box在这两个转换后确定您的可见场景.

那么根据你的问题,我假设您想要使用具有顶点坐标和变换的像素单位的2D坐标系?在这种情况下,最好通过使用glOrtho(0.0, w, 0.0, h, -1.0, 1.0)with wh视口的尺寸来完成.这基本上会对视口转换进行计数,因此[0,w]x[0,h]x[-1,1]会将顶点从-box转换为[-1,1]-box,然后视口转换会转换回[0,w]x[0,h]x[0,1]-box.

这些是非常普遍的解释,没有提到实际的变换是通过矩阵 - 向量乘法完成的,并且没有谈论同质坐标,但它们应该已经解释了要点.gluProject的这个文档也可能会给你一些见解,因为它实际上为单个顶点建模了转换管道.但是在这个文档中,他们实际上忘了v" = v' / v'(3)v' = P x M x v步骤之后通过w component()来提及除法.

编辑:不要忘记查看epatel答案中的第一个链接,这解释了转换管道更加实用和详细.


epa*_*tel 12

它被称为转型.

顶点以3D坐标设置,并转换为视口坐标(进入窗口视图).可以以各种方式设置该转换.正交变换最容易理解为启动器.

http://www.songho.ca/opengl/gl_transform.html

http://www.opengl.org/wiki/Vertex_Transformation

http://www.falloutsoftware.com/tutorials/gl/gl5.htm