Understanding OpenGL
Understanding OpenGL
我有一些关于OpenGL的基本观点/问题,并不都涉及代码,但也涉及概念。如果你能回答、肯定或详述其中任何一个问题,我将不胜感激。我警告你,有些人可能很天真,所以请原谅我。
-
我理解OpenGL只是一个标准,而不是一个软件。例如,"获取"OpenGL实际上涉及到获取第三方实现,这并不一定要得到Khronos的认可。
-
OpenGL通常是指GL实用工具(GLU)和GL实用工具工具包(GLUT)的组合。他们有以
glu
和glut
开头的方法。和"基本"OpenGL方法,从简单的gl
开始,由那些制作图形驱动程序的人实现,即NVIDIA? -
我假设
glut
方法是特定于操作系统的助手,例如glutKeyboardFunc()
必须是,以解释键盘。所以如果我想要一个更强大的替代方式来解释键盘输入,我会使用OS API。OpenGL本身纯粹是关于图形的,但是glut
有这样的东西,因为如果没有实时的人工控制,图形就不会有多大作用。 -
在我看来,
glu
方法可能与调用一系列较低级别的gl
方法相同。我想引用的一个例子是glOrtho()
和gluPerspective()
。在我看来,他们似乎有类似的工作方式,但计算视角可能更复杂,所以gluPerspective()
是为了方便,但可能只是解决一些gl
方法。 -
我在大学里使用freeglut学习了基本的OpenGL,我一直有一个使用OpenGL的"硬核"方式的愿景,只使用低级方法。我不知道这是否是一个完全天真的想法,但是否有一种"专业"的方式来编写OpenGL,以发挥其最大的功能?例如,游戏开发者可能不会使用
glutPostRedisplay()
,对吧?它看起来太简单方便了,好像它隐藏了很多正在发生的事情。我怀疑c++也是如此,因为GLUT回调对名称空间中的方法不友好(正如我在其他问题中看到的那样)。
1。我知道OpenGL只是一个标准,而不是一个软件。例如,获取OpenGL实际上涉及到获取第三方实现并不一定是
。
2。OpenGL通常是指GL实用工具(GLU)和GL实用工具工具包(GLUT)的组合。他们的方法以
glu
和glut
,分别为。和基本的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或低级调用并不会使应用程序变得更好或更糟:)
希望能有所帮助
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- Understanding OpenGL