C++ OpenGL以像素为单位定义顶点位置
我一直在用OpenGL/C++编写一个2D基本游戏引擎,并在学习过程中学习了所有内容。我仍然对定义顶点及其“位置”相当困惑。也就是说,我仍在努力理解OpenGL的顶点到像素转换机制。可以简单地解释一下,或者有人可以指着一篇文章或其他东西来解释这一点。谢谢 谷歌搜索“opengl渲染管道”。前五篇文章都提供了很好的论述C++ OpenGL以像素为单位定义顶点位置,c++,opengl,C++,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管道如下所示:
[-1,1]
范围内。这个范围之外的一切都被剪掉了[-1,1]
范围变换为[0,w]x[0,h]x[0,1]
立方体(假设glViewport(0,w,0,h)
调用),这是帧缓冲区中顶点的最终位置,因此也是其像素坐标