了解OpenGL

时间:2011-11-01 15:25:57

标签: c++ c opengl

我有一些关于OpenGL的基本要点/问题,不是所有涉及代码而是概念。如果你能回答,肯定或扩展他们中的任何一个,我将不胜感激。我警告你,有些人可能天真,所以请耐心等待。

  1. 我知道OpenGL只是一个标准,而不是一个软件。例如,“获取”OpenGL实际上涉及获得第三方实施,而不一定必须得到Khronos的认可。

  2. OpenGL通常指GL实用程序(GLU)和GL实用工具包(GLUT)的组合。他们的方法以gluglut开头。而那些以简单gl开头的'基本'OpenGL方法是由制作图形驱动程序的人实现的,即NVIDIA?

  3. 我假设glut方法是特定于操作系统的帮助程序,例如glutKeyboardFunc()必须是,以解释键盘。因此,如果我想要一种更强大的替代方式来解释键盘输入,我只会使用OS API。 OpenGL本身纯粹是关于图形的,但是glut有这种东西,因为图形并没有太多没有实时的人为控制。

  4. 在我看来,glu方法可能与调用一系列低级gl方法完全相同。我想引用的一个例子是glOrtho()gluPerspective()。在我看来,他们有类似的工作方式,但计算透视可能会更复杂,因此gluPerspective()是为了方便起见,但可能只解决某些gl方法。

  5. 我在大学时使用freeglut学习了基本的OpenGL,并且我一直只使用低级方法来实现使用OpenGL的“硬核”方式。我不知道这是否是一个完全天真的想法,但是有一种“专业”的方式来编写OpenGL,以获得它的最大功能吗?比如,据推测,游戏开发者不会使用glutPostRedisplay(),对吧?这似乎太容易和方便,就像它隐藏了很多正在发生的事情。我怀疑C ++也是如此,因为GLUT回调对命名空间中的方法不友好(正如我在其他问题中看到的那样)。

2 个答案:

答案 0 :(得分:17)

  

\ 1.我知道OpenGL只是一个标准,而不是一个软件。例如,'获得'OpenGL实际上涉及获得一个   第三方实施,不一定非必须   由Khronos认可。

确实

  

\ 2.OpenGL通常是指GL实用程序(GLU)和GL实用工具包(GLUT)的组合。他们有方法开头   gluglut,分别为glgl…。和'基本的'OpenGL方法,开始   只需glut,由制作图形驱动程序的人实现,   即NVIDIA?

没有。 OpenGL只是以glutKeyboardFunc()开头的函数。其他所有(GLU,GLUT)都是第三方库,OpenGL没有涵盖。

  

\ 3.我假设glut方法是特定于操作系统的帮助程序,例如glu必须是,以解释键盘。所以,如果我   想要一种更强大的替代方式来解释键盘输入,我   只会使用OS API。 OpenGL本身纯粹是关于图形,但是   gl有这种事情,因为图形并不多见   实时人为控制。

正确。 GLUT是一个非常小的框架,因此强烈建议使用其他东西。

  

\ 4.在我看来,glOrtho()方法可能与调用一系列低级gluPerspective()方法完全相同。我想引用一个例子   是gluOrtho2DglOrtho

我想你提到gluOrtho2D但是,你是对的。 void gluOrtho2D(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top) { glOrtho(left, right, bottom, top, -1, 1); } 是一个真正的OpenGL-1函数。在某种程度上,gluPerspective()是有史以来最无用的功能之一:

gl
  

在我看来他们有相似之处   工作方式,但计算透视可能会更复杂,所以   gluPrespective(GLfloat fov, GLfloat aspect, GLfloat near, GLfloat far) { GLfloat a = 0.5 * atan(fov); glFrustum(-a*near, a*near, -a*near/aspect, a*near/aspect, near, far); } 是为了方便,但可能会解决一些问题   glutPostRedisplay()方法。

再一次,但实际上很简单:

{{1}}

从OpenGL-3核心开始,整个矩阵操作内容已被删除。在任何严肃的应用程序中它都没用,因为无论如何你都会自己管理矩阵。

  

\ 5.我在大学时使用freeglut学习了基本的OpenGL,并且我一直在使用OpenGL的“硬核”方式。   只有低级方法。我不知道这是不是很天真   我想,但是有一种“专业”的方式来编写OpenGL   它的最大功能?就像,大概是游戏开发者一样   例如,不会使用{{1}},对吧?

是的,这是可能的,并且大多数游戏引擎确实做了所有咕噜咕噜的工作。 有libSDL,它也涵盖了OpenGL。我个人更喜欢GLFW或者自己做这些事情。但是,这并没有改变使用OpenGL本身的方式。但这只是基础设施,而且主要是编写样板代码。作为初学者,如果不使用已建立的框架,您获得的收益很少。如果您的程序大量使用GUI小部件,那么使用Qt或GTK及其嵌入式OpenGL小部件是一个合理的选择。

然而,有些项目非常核心,并且也使用OpenGL实现整个GUI。 Blender是最极端的例子,我喜欢它。

  

它似乎太容易和方便了,就像它隐藏了许多正在发生的事情。一世   怀疑这对C ++也是如此,因为GLUT回调不友好   使用命名空间中的方法(正如我在其他问题中看到的那样)。

GLUT回调可以使用命名空间(命名空间只是C ++编译时间)。但是,不可能将类实例方法作为GLUT / C回调传递。

答案 1 :(得分:5)

你似乎对OpenGL和takeit有一个非常好的概念。不知道还有什么要说的。 我猜(5)确实是人们可以评论的地方。

根据您正在构建的应用程序类型,您认为有些人会选择仅使用本机GL调用来构建应用程序。

例如,如果您在具有OpenGl视图的Windows下构建单个文档应用程序,而且还有标准菜单和工具栏,那么很有可能您希望直接使用c ++以及您所谓的“低级别”API

但是,如果你在全屏模式下构建一个低节奏的游戏,那么如果它可以简化应用程序的开发,你就不应该使用Glut或任何其他工具包。

直接单独使用GLut或低级别调用的事实不会使应用程序变得更好或更差:)

希望有所帮助