Understanding OpenGL

Understanding OpenGL

本文关键字:OpenGL Understanding      更新时间:2023-10-16

我有一些关于OpenGL的基本观点/问题,并不都涉及代码,但也涉及概念。如果你能回答、肯定或详述其中任何一个问题,我将不胜感激。我警告你,有些人可能很天真,所以请原谅我。

  1. 我理解OpenGL只是一个标准,而不是一个软件。例如,"获取"OpenGL实际上涉及到获取第三方实现,这并不一定要得到Khronos的认可。

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

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

  4. 在我看来,glu方法可能与调用一系列较低级别的gl方法相同。我想引用的一个例子是glOrtho()gluPerspective()。在我看来,他们似乎有类似的工作方式,但计算视角可能更复杂,所以gluPerspective()是为了方便,但可能只是解决一些gl方法。

  5. 我在大学里使用freeglut学习了基本的OpenGL,我一直有一个使用OpenGL的"硬核"方式的愿景,只使用低级方法。我不知道这是否是一个完全天真的想法,但是否有一种"专业"的方式来编写OpenGL,以发挥其最大的功能?例如,游戏开发者可能不会使用glutPostRedisplay(),对吧?它看起来太简单方便了,好像它隐藏了很多正在发生的事情。我怀疑c++也是如此,因为GLUT回调对名称空间中的方法不友好(正如我在其他问题中看到的那样)。

1。我知道OpenGL只是一个标准,而不是一个软件。例如,获取OpenGL实际上涉及到获取第三方实现并不一定是

2。OpenGL通常是指GL实用工具(GLU)和GL实用工具工具包(GLUT)的组合。他们的方法以gluglut,分别为。和基本的OpenGL功能,那开始简单的gl,是由那些制作图形驱动的人实现的,也就是说,英伟达?

。OpenGL只是以gl…开头的函数。其他的(GLU, GLUT)都是第三方库,不包含在OpenGL中。

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

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

4。在我看来,glu方法可能与调用一系列较低级别的gl方法相同。我想引用一个例子是glOrtho()gluPerspective() .

我想你指的是gluOrtho2D,但是是的,你是正确的。glOrtho是一个真正的OpenGL-1函数。在某种程度上,gluOrtho2D是有史以来最没用的函数之一:

void gluOrtho2D(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
{
    glOrtho(left, right, bottom, top, -1, 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);
}

从OpenGL-3核心开始,整个矩阵操作的东西已经被删除了。在任何严肃的应用程序中,它几乎没有什么用处,因为无论如何您都要自己管理矩阵。

5。我在大学里使用freeglut学习了基本的OpenGL,我一直有一个使用OpenGL的"硬核"方式的愿景,使用只有低级别的方法。我不知道这是不是太天真了但是否有一种"专业"的方式来编写OpenGL它的最大功能是什么?比如游戏开发者不会使用glutPostRedisplay(),对吧?

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

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

看起来太简单方便了,好像隐藏了很多正在发生的事情。我我怀疑c++也是如此,因为GLUT回调并不友好与名称空间中的方法(正如我在其他问题中看到的)。

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

你似乎对OpenGL和工具包有一个很好的概念。不知道还有什么好说的。我想(5)才是真正值得评论的地方。

根据你正在构建的应用程序的类型,你认为有些人会选择只使用本地GL调用来构建他们的应用程序是正确的。

例如,如果你在windows下构建一个单一的文档应用程序,它有一个OpenGl视图,但也有标准的菜单和工具栏,那么你很有可能想直接使用c++和你所谓的"低级"api。

然而,如果你是在全屏模式下制作一款低节奏的游戏,那么你就没有理由不使用Glut或其他能够简化应用开发的工具包。

直接使用GLut或低级调用并不会使应用程序变得更好或更糟:)

希望能有所帮助