Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL以像素为单位定义顶点位置_C++_Opengl - Fatal编程技术网

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

C++ OpenGL以像素为单位定义顶点位置,c++,opengl,C++,Opengl,我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在学习过程中学习了所有内容。我仍然对定义顶点及其“位置”相当困惑。也就是说,我仍在努力理解OpenGL的顶点到像素转换机制。可以简单地解释一下,或者有人可以指着一篇文章或其他东西来解释这一点。谢谢 谷歌搜索“opengl渲染管道”。前五篇文章都提供了很好的论述 从顶点到像素(实际上是碎片,但如果你认为“像素”的话,你不会离得太远)的关键点转换处于光栅化阶段,在所有顶点从世界坐标转换到屏幕坐标并进行剪裁之后,就会发生光栅化阶段。这称为变换

我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在学习过程中学习了所有内容。我仍然对定义顶点及其“位置”相当困惑。也就是说,我仍在努力理解OpenGL的顶点到像素转换机制。可以简单地解释一下,或者有人可以指着一篇文章或其他东西来解释这一点。谢谢

谷歌搜索“opengl渲染管道”。前五篇文章都提供了很好的论述


从顶点到像素(实际上是碎片,但如果你认为“像素”的话,你不会离得太远)的关键点转换处于光栅化阶段,在所有顶点从世界坐标转换到屏幕坐标并进行剪裁之后,就会发生光栅化阶段。

这称为变换

顶点在三维坐标中设置,该坐标转换为视口坐标(在窗口视图中)。可以通过多种方式设置此转换。正交变换作为起点最容易理解


首先要知道OpenGL不使用标准像素坐标。我的意思是,对于特定的分辨率,例如800x600,你没有0-799或1-800范围内的水平坐标。你们可以将坐标范围从-1到1,然后发送到图形卡光栅化单元,然后匹配到特定的分辨率

我在这里介绍了一个步骤——在所有这些步骤之前,您有一个ModelViewProjection矩阵(或者在一些简单的情况下是viewProjection矩阵),它将把您使用的坐标转换为投影平面。默认情况下,它用于实现一个相机,该相机可以转换世界的三维空间(视图用于将相机放置到正确的位置,投影用于将三维坐标转换到屏幕平面。在ModelViewProjection中,它也是将模型放置到世界的正确位置的步骤)

另一种情况(您可以通过这种方式使用投影矩阵来实现所需的)是使用这些矩阵将一个分辨率范围转换为另一个分辨率范围

你需要一个技巧。如果您想认真学习,应该阅读openGL中的modelViewProjection matrix和camera。但现在我要告诉你们,使用适当的矩阵,你们可以将你们自己的坐标系(也就是说,使用0-799水平和0-599垂直的范围)转换成标准化的-1:1范围。这样,您就不会看到底层openGL api使用他自己的-1对1系统

实现这一点的最简单方法是glOrtho函数。以下是指向文档的链接:

这是正确使用的示例: glMatrixMode(GL_投影) glLoadIdentity(); 格洛托(0,800,600,0,0,1) glMatrixMode(GLU模型视图)

现在,您可以使用自己的modelView矩阵,即平移(移动)对象,但不要触摸投影示例。此代码应在执行任何绘图命令之前执行。(如果您不使用3d图形,实际上可以在初始化opengl之后)

下面是一个工作示例:

只画你的数字,而不是画文字。还有另一件事-glPushMatrix和GLPOPMARRIX for choosen矩阵(在本例中为投影矩阵)-只有将3d渲染与2d渲染相结合,才能使用它

您仍然可以使用模型矩阵(即,用于在世界的某个地方放置平铺)和视图矩阵(例如,用于缩放视图或滚动世界-在这种情况下,您的世界可能大于分辨率,您可以通过简单的转换裁剪视图)


在看了我的答案后,我发现它有点混乱,但如果您感到困惑,请阅读有关模型、视图和投影材质的内容,并尝试使用glOrtho的示例。如果您仍然感到困惑,请随时提问。

这是您最喜爱的OpenGL学习资源应该首先教给您的基础知识。但无论如何,标准OpenGL管道如下所示:

  • 顶点位置从对象空间(某个对象的局部)变换到世界空间(相对于某个全局坐标系)。此变换指定对象(顶点所属)在世界中的位置

  • 现在,世界空间位置已转换为摄影机/视图空间。此变换由查看场景所依据的虚拟摄影机的位置和方向确定。在OpenGL中,这两种转换实际上合并为一种模式视图矩阵,它直接将顶点从对象空间转换到视图空间

  • 接下来应用投影变换。尽管modelview变换应仅包含仿射变换(旋转、平移、缩放),但投影变换可以是透视变换,它基本上会扭曲对象以实现真实的透视视图(距离较远的对象较小)。但在2D视图中,它可能是一个正交投影,它只做平移和缩放。这种转换在OpenGL中由投影矩阵表示

  • 在这3次(或2次)变换之后(然后在透视图除以w分量之后,实际上实现了透视图失真,如果有的话),您得到的是标准化设备坐标。这意味着在这些变换之后,可见对象的坐标应在
    [-1,1]
    范围内。这个范围之外的一切都被剪掉了

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

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

    <