我有一些关于OpenGL的基本要点/问题,不是所有涉及代码而是概念。如果你能回答,肯定或扩展他们中的任何一个,我将不胜感激。我警告你,有些人可能天真,所以请耐心等待。
我知道OpenGL只是一个标准,而不是一个软件。例如,“获取”OpenGL实际上涉及获得第三方实施,而不一定必须得到Khronos的认可。
OpenGL通常指GL实用程序(GLU)和GL实用工具包(GLUT)的组合。他们的方法以glu
和glut
开头。而那些以简单gl
开头的'基本'OpenGL方法是由制作图形驱动程序的人实现的,即NVIDIA?
我假设glut
方法是特定于操作系统的帮助程序,例如glutKeyboardFunc()
必须是,以解释键盘。因此,如果我想要一种更强大的替代方式来解释键盘输入,我只会使用OS API。 OpenGL本身纯粹是关于图形的,但是glut
有这种东西,因为图形并没有太多没有实时的人为控制。
在我看来,glu
方法可能与调用一系列低级gl
方法完全相同。我想引用的一个例子是glOrtho()
和gluPerspective()
。在我看来,他们有类似的工作方式,但计算透视可能会更复杂,因此gluPerspective()
是为了方便起见,但可能只解决某些gl
方法。
我在大学时使用freeglut学习了基本的OpenGL,并且我一直只使用低级方法来实现使用OpenGL的“硬核”方式。我不知道这是否是一个完全天真的想法,但是有一种“专业”的方式来编写OpenGL,以获得它的最大功能吗?比如,据推测,游戏开发者不会使用glutPostRedisplay()
,对吧?这似乎太容易和方便,就像它隐藏了很多正在发生的事情。我怀疑C ++也是如此,因为GLUT回调对命名空间中的方法不友好(正如我在其他问题中看到的那样)。
答案 0 :(得分:17)
\ 1.我知道OpenGL只是一个标准,而不是一个软件。例如,'获得'OpenGL实际上涉及获得一个 第三方实施,不一定非必须 由Khronos认可。
确实
\ 2.OpenGL通常是指GL实用程序(GLU)和GL实用工具包(GLUT)的组合。他们有方法开头
glu
和glut
,分别为gl
和gl…
。和'基本的'OpenGL方法,开始 只需glut
,由制作图形驱动程序的人实现, 即NVIDIA?
没有。 OpenGL只是以glutKeyboardFunc()
开头的函数。其他所有(GLU,GLUT)都是第三方库,OpenGL没有涵盖。
\ 3.我假设
glut
方法是特定于操作系统的帮助程序,例如glu
必须是,以解释键盘。所以,如果我 想要一种更强大的替代方式来解释键盘输入,我 只会使用OS API。 OpenGL本身纯粹是关于图形,但是gl
有这种事情,因为图形并不多见 实时人为控制。
正确。 GLUT是一个非常小的框架,因此强烈建议使用其他东西。
\ 4.在我看来,
glOrtho()
方法可能与调用一系列低级gluPerspective()
方法完全相同。我想引用一个例子 是gluOrtho2D
和glOrtho
。
我想你提到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或低级别调用的事实不会使应用程序变得更好或更差:)
希望有所帮助