首页 > 其他分享 >openGL

openGL

时间:2023-04-13 09:56:23浏览次数:30  
标签:函数 OpenGL Windows glut openGL 扩展 开发

 

 

OpenGL开发库的详细介绍zz

发布于2018-10-09 10:53:32阅读 1.2K0  

开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式

<库前缀><根命令><可选的参数个数><可选的参数类型>

库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库等,从函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如glVertex3fv()表示了该函数属于gl库,参数是三个float型参数指针。我们用glVertex*()来表示这一类函数。

OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。

1.  OpenGL核心库

核心库包含有115个函数,函数名的前缀为gl。

这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数。

绘制基本几何图元的函数。如绘制图元的函数glBegain()、glEnd()、glNormal*()、glVertex*()。

矩阵操作、几何变换和投影变换的函数。如矩阵入栈函数glPushMatrix()、矩阵出栈 函数glPopMatrix()、装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()等等。

颜色、光照和材质的函数。如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial()等等。

显示列表函数、主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。

纹理映射函数,主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、 设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。

特殊效果函数。融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。

光栅化、象素操作函数。如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()等。

选择与反馈函数。主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()等。

曲线与曲面的绘制函数。生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。

状态设置与查询函数。主要有glGet*()、glEnable()、glGetError()等。

2.  OpenGL实用库The OpenGL Utility Library (GLU)

包含有43个函数,函数名的前缀为glu。

OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种。

辅助纹理贴图函数,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。

坐标转换和投影变换函数,定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和 gluUnProject()等等。

多边形镶嵌工具,有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等等。

二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。

非均匀有理B样条绘制工具,主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty()等函数。

错误反馈工具,获取出错信息的字符串gluErrorString().

3.  OpenGL辅助库

包含有31个函数,函数名前缀为aux。

这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由glaux.dll来负责解释执行。创建aux库是为了学习和编写OpenGL程序,它更像是一个用于测试创意的预备基础接管。Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。

辅助库函数主要包括以下几类。

窗口初始化和退出函数,auxInitDisplayMode()和auxInitPosition()。

窗口处理和时间输入函数,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。

颜色索引装入函数,auxSetOneColor()。

三维物体绘制函数。包括了两种形式网状体和实心体,如绘制立方体auxWireCube()和 auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四面体auxWireTetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶auxWireTeapot()。

背景过程管理函数auxIdleFunc()。

程序运行函数auxMainLoop()。

4.  OpenGL工具库 OpenGL Utility Toolkit

包含大约30多个函数,函数名前缀为glut。

glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。 函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。

这部分函数主要包括

窗口操作函数,窗口初始化、窗口大小、窗口位置等函数glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。

回调函数。响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。

创建复杂的三维物体。这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。

菜单函数。创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。

程序运行函数,glutMainLoop()。

5.  Windows专用库

针对windows平台的扩展。包含有16个函数,函数名前缀为wgl。

这部分函数主要用于连接OpenGL和Windows ,以弥补OpenGL在文本方面的不足。  Windows专用库只能用于Windows环境中。

这类函数主要包括以下几类

绘图上下文相关函数wglCreateContext(), wglDeleteContext()wglGetCurrentContent() wglGetCurrentDC() wglDeleteContent()等

文字和文本处理函数 wglUseFontBitmaps()、wglUseFontOutlines()。

覆盖层、地层和主平面层处理函数 wglCopyContext()、wglCreateLayerPlane()、  wglDescribeLayerPlane()、wglReakizeLayerPlatte()等

其他函数,wglShareLists()、wglGetProcAddress()等。

6.  Win32 API函数库

 包含有6个函数,函数名无专用前缀。

是win32扩展函数。这部分函数主要用于处理像素存储格式和双帧缓存。这6个函数将替换Windows GDI中原有的同样的函数。Win32API函数库只能用于Windows 95/98/NT环境中。

7         X窗口专用库

是针对Unix和Linux的扩展函数。

包括渲染上下文、绘制图元、显示列表、纹理贴图、等等

初始化 glXQueryExtension()

渲染上下文函数, glXCreateContext() glXDestroyContext() glXCopyContext() glXMakeCurrent() glXCreateGLXPixmap()

执行 glXWaitGL()、glXWaitX()

缓冲区和字体 glXSwapBuffers()、glXUseXFont()

8 其他扩展库

这些函数可能是新的OpenGL函数,并没有在标准OpenGL库中实现,或者它们是用来扩展已存在的OpenGL函数的功能。和glu、glx和wgl一样,这些OpenGL扩展是由硬件厂商和厂商组织开发的。OpenGL扩展(OpenGL Extention)包含了大量的扩展API函数。

随着硬件的更新,硬件厂商首先向SGI申请登记新的扩展,编写规格说明书(specification)。然后按照说明书进行开发扩展程序。不同的OpenGL实现(OpenGL Implementation)支持的扩展可能不一样,只有随着某一扩展的推广与应用以及硬件技术的提高该扩展才会在所有的OpenGL实现中被给予支持,从而最终成为OpenGL标准库的一部分。扩展由SGI维护,在SGI网站上列出了目前公开的已注册的扩展及其官方说明书。

扩展源由扩展函数的后缀来指明(或使用扩展常量后缀)。例如,后缀WIN表明一个符合Windows规范的扩展,EXT或ARB后缀表明该扩展由多个卖主定义。

下面给出OpenGL官方规定的命名规则:

ARB – OpenGL Architecture Review Board 正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和ARB扩展,应该优先使用ARB扩展

EXT – 多家OpenGL厂商同意支持的扩展

HP – Hewlett-Packard 惠普

IBM – International Business Machines

KTX – Kinetix, maker of 3D Studio Max

INTEL – Intel 公司

NV – NVIDIA 公司

MESA – Brian Paul’s freeware portable OpenGL implementation

SGI – Silicon Graphics公司开发的扩展

SGIX – Silicon Graphics (experimental) 公司开发的实验性扩展

SUN – Sun Microsystems

WIN – Microsoft

由于OpenGL扩展在针对不同平台和不同驱动,OpenGL不可能把所有的接口程序全部放到gl.h、glx.h、wgl.h中,而是将这些函数头放在了glext.h、glxext.h和wglext.h中。这些扩展被看作时OpenGL核心库规范的增加和修改。

OpenGL扩展也不是没有缺点,正因为各个硬件厂商都可以开发自己的扩展,所以扩展的数目比较大,而且有点混乱,有些扩展实现的相同的功能,可因为是不同厂商开发的,接口却不一样,所以程序中为了实现这个功能,往往要为不同的显卡写不同的程序。这个问题在OpenGL 2.0出来后可能会得到解决,OpenGL 2.0的一个目标就是统一扩展,减少扩展数目。

 

 

Linux 下的 OpenGL 之路(二):为什么说使用 Linux 系统学习 OpenGL 更方便

Posted on 2021-01-27 01:09  京山游侠  阅读(3350)  评论(1)  编辑  收藏  举报

阅读目录

回到顶部

前言

上一篇随笔介绍了我的电脑,同时也介绍了 Ubuntu 20.10 系统的安装和美化。这一篇,我将正式开始 OpenGL 之旅。使用 Ubuntu 来进行开发,不仅仅只是因为我对 Linux 桌面比较熟悉,其实我对 Windows 也很熟悉,主要还是因为在 Linux 系统下搭建 OpenGL 的开发环境确实是太方便了。在 Windows 下开发 OpenGL,每用到一个库,我们都要单独去搜索和下载,然后在 Visual Studio 中进行设置,很繁琐。在 Ubuntu 中,安装这些库,就是一条命令的事,下面详细论述。

回到顶部

搭建 OpenGL 的开发环境

学 OpenGL,C/C++ 应该是首选,所以先安装 C/C++ 的开发环境,无论是选择 GCC,还是选择 CLang,在 Ubuntu 中就是一条命令的事,我这里选 GCC。在 Ubuntu 中,可以直接安装 build-essential,更省事。命令如下:

sudo apt install build-essential

OpenGL 不提供和 GUI 相关的 API,所以 OpenGL 不能处理诸如创建窗口、处理用户的键盘鼠标输入这样的任务。这时,我们需要 GLFW。使用 GLFW 库,我们可以简化搭建 OpenGL 程序框架的任务,同时还可以轻松获得跨平台的功能。安装 GLFW 也是一条命令的事:

sudo apt install libglfw3 libglfw3-dev

除此之外,我们还需要 GLEW。有了GLEW 扩展库,就再也不用为找不到函数的接口而烦恼了,因为GLEW能自动识别平台所支持的全部 OpenGL 高级扩展涵数。安装命令如下:

sudo apt install libglew2.1 libglew-dev

另外,在写 OpenGL 程序的过程中,会经常需要进行向量、矩阵的计算,所以有一个顺手的数学库是很重要的,我这里选择 GLM。安装命令如下:

sudo apt install libglm-dev

学会了 OpenGL 的基本概念后,当然会忍不住想加载个 3D 模型看看效果,这时候,就可以考虑使用 Assimp 库了。安装命令如下:

sudo apt install assimp-utils libassimp5 libassimp-dev

assimp-utils 包提供了一个assimp命令,使用该命令可以显示 Assimp 库支持哪些格式的 3D 模型文件,也可以使用该命令显示 3D 模型文件的详细信息,如下图:

当然,3D 的东西,还是应该用可视化的方式看起来更直观一些。好在,Linux 中可用的 3D 建模动画软件有 Blender。安装起来也只是一条命令的事:

sudo apt install blender

下面,让大家看一下我的老婆,用的就是 Blender:

 

 

 

 

 

参考:

https://cloud.tencent.com/developer/article/1351689

https://www.cnblogs.com/youxia/p/cg002.html

标签:函数,OpenGL,Windows,glut,openGL,扩展,开发
From: https://www.cnblogs.com/rebrobot/p/17312297.html

相关文章

  • C#+OpenGL编程之OpenGL 纹理载入
     本文基础:C#+OpenGL编程之环境搭建载入一个模型,光秃秃的可不好,这课开始学习纹理载入,纹理载入需要注意的地方就是最好只载入一次纹理,否则容易影响性能。C#载入纹理要比C方便多了,问题在于C#的GDI+不支持TGA载入,我就网上找了个类,这里请大家去原作者那里看了。如需素材或C代码请参......
  • OpenGL是什么?Win10+VS2019下搭建glfw+glad开发环境
    1、什么是OpenGL什么是OpenGLOpenGL是一套API接口。学习这套接口,就可以在那些支持OpenGL的机器上正常使用这些接口,在屏幕上看到绘制的结果。显卡厂商的支持这套接口是Khronos(科纳斯)这个组织在维护,怎么维护呢?就是写一个说明书,指导各个GPU厂家,如果他们要支持OpenGL的话,要怎......
  • [计算机图形学] OpenGL读取obj文件并显示其3D效果
       读取三维网格模型(WavefrontOBJ文件)无法向立方体:cube.obj有法向兔子模型:bunny.obj有法向有纹理八字模型:Eight.objOBJ文件的格式可参考:http://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html 利用OpenGL显示该模型的绘制效果(全部)顶点显示线条显示面片显示 核心......
  • OpenGL Mac开发-如何使用imgui(1.89.4)插件进行调试
    为了调试我们的OpenGLDemo,可以尝试使用一个成熟的开源GUI插件imgui。1,首先进入imgui在github上的地址。在Release中下载最近的版本,可以得到一个Zip压缩包。现在是2023年的4月1日,我下载到的版本是1.89.4,与Cherno的OpenGL教程中的代码略微有些区别。如果你看的是Cherno的教程,也......
  • opengl在编译的过程中,glad使用
    我在编译的过程中,遇到:无法找到-lglad这个错误。最后才发现对于glad的使用不能用-glad。因为我们通过glad的在线服务可以得到一些文件,其中glad.c文件我们是需要放在我们的项目下面的。之后在编译的过程中使用下面这个命令:g++mian.cppglad.c-omain.exe这样,我们就可以使用......
  • OpenGL环境搭建时遇到的问题
    前言 环境搭建流程貌似不是大问题,问题是中间遇到的问题背景 最近打算学习下OpenGL,遂开始按照教程搭建环境,昨天搭建了一天也没成功,差点就放弃了。环境Windows10 V......
  • Opengl ES之矩阵变换(上)
    前言说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到放弃的念头,不慌,作为了一个应用层的CV工程师,在实际应用中线性代数哪......
  • 四、第一个opengl的qt程序
    原链接1、QOpenGLWidget:不需要GLFWQOpenGLWdiget提供了三个便捷的虚函数,可以重载,用来重新实现典型的OpenGL任务:.panitGL:渲染OpenGL场景。widget需要更新时调用。.resiz......
  • LearnOpenGL (2) 绘制三角形
    本文基于Win10+VisualStudio2019+OpenGL3.3。参考“你好,三角形”。一、准备工作图形渲染管线 顶点数据 图元 顶点缓冲对象(VBO) 顶点数组对象(VAO) ......
  • 三、OpenGL对象
     原链接1、一个对象是指一些选项的集合,代表OpenGL状态的一个子集。例如:我们可以用一个对象来代表绘图窗口的设置,设置它的大小、支持的颜色、位数等等。可以把对象看作......