OpenGL Overview

来源:互联网 发布:淘宝用流量看费不 编辑:程序博客网 时间:2024/06/06 02:37

OpenGL Overview(待修整)

一、什么是OpenGL?  

   OpenGL(Open GraphicsLibrary)是图形硬件的一种软件接口,独立于硬件、跨平台,是一个开放的标准,可以通过调用OpenGL的函数来访问和操作图形硬件,生成逼真的三维场景(由模型生成图像)。

注:图形硬件可以理解成显卡,下图是简单的OpenGL管道线流程(所谓管道线流程是顶点数据被处理的先后过程)。

       其中vertices表示组成模型的数据,由应用程序提供,OpenGL不负责模型数据的生成,只负责将模型数据生成最终的图像,这一过程被称为渲染(Rendering),步骤如下:

       1、以OpenGL支持的基本图元来指定构建模型的数据,如上图三角形的三个顶点和颜色,调用OpenGL 函数将数据加载到GPU内存;

       2、执行不同的着色器程序(如上图的vertex shader和geometry shader)对图元进行处理,注意上图每个方框均代表处理过程中的一个阶段,只有上一个阶段对所有的图元处理完成后,才进入下一个处理阶段,以决定图元的位置、颜色和其它渲染属性;

       3、上图第一行执行完成后,到达Rasterization,Rasterization主要将图元的数学描述转变成片段(Fragment),每个片段对应屏幕上的一个或多个像素位置;

       4、最后由片段程序(Fragment shader)来决定每个片元最终的颜色和屏幕上对应的位置。

       5、片段程序执行过后,还可以进行混合等其它一些操作,来决定最后渲染的结果。

 

二、 OpenGL扩展函数库 

    当独立厂商(显卡生产厂商)创建一种新技术时,OpenGL标准允许它们通过“扩展”的方法提供所扩展的功能(OpenGL体系结构审核委员会掌握的标准会落后于硬件厂商,意味着最新的技术一般都是以扩展的方式提供的)。然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动(lib、dll)。每个厂商有一个用于命名它们的新函数和常量的字母缩写(按照OpenGL标准)。例如,NVIDIA的缩写("NV")用于定义它们的专有函数“glCombinerParameterfvNV()”和它们的常量“GL_NORMAL_MAP_NV”。如果多于一个厂商同意实现相同的扩展功能,那么就用缩写“EXT”(glCombinerParameterfvEXT())。进一步,架构评审委员可能会“祝福”这个扩展,那么这就被称为一个“标准扩展”,使用缩写“ARB”。第一个ARB扩展是GL_ARB_multitexture。根据官方扩展提升路径,多纹理不再是可选实现的ARB扩展,它已经是OpenGL 1.4以后的核心API的一部分。(本段内容来自维基百科)

    以下几个扩展库创建在OpenGL之上,提供了OpenGL核心没有的功能:

    1、GLEW(网址:http://glew.sourceforge.net/)

    2、GLEE(网址:http://elf-stone.com/glee.php)

    3、GLUT(网址:http://user.xmission.com/~nate/glut.html for win32)

    4、GLU

    Windows下的OpenGL编程

    微软为了维护Direct3D,对OpenGL的支持很消极,其OpenGL实现仍然是1.1。由于Windows上的OpenGL程序最终都会动态链接到微软的OpenGL32.dll,可OpenGL32.dll只支持OpenGL1.1,使我们不能直接使用新版OpenGL,仍然要用扩展访问OpenGL1.1以来新增的功能。”。所以在Windows下要使用OpenGL的一些高级特性,就必须要使用额外的OpenGL扩展库,主要用的有两个GLUT和GLEW

GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口。使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些OpenGL的高级特性,就必须下载最新的扩展,另外,不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数,你要想用这数涵数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识 别你的平台所支持的全部OpenGL高级扩展涵数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全 部函数。GLEW支持目前流行的各种操作系统(including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris)。


项目主页: http://glew.sourceforge.net/ 
文档地址: http://glew.sourceforge.net/install.html 
下载地址: https://sourceforge.net/project/downloading.php?group_id=67586&filename=glew-1.5.1-src.zip 

 

glu是实用库,包含有43个函数,函数名的前缀为glu。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。
glaux是OpenGL辅助库,包含有31个函数,函数名前缀为aux。这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。
glut是实用工具库,基本上是用于做窗口界面的,并且是跨平台(所以有时你喜欢做简单的demo的话,可以光用glut就ok了)

 

GLX:OpenGL extension for X.

对于X窗口系统,它所使用的的OpenGL扩展(GLX)是作为OpenGL的一个附件提供的,所有的GLX函数都使用前缀glX。

 

 

常见的OpenGL头文件如下:(Windows系统中可以忽略大小写的区别,我自己也没太注意大小写。同时,文件的路径可能变化,例如不是<GL/gl.h>而是"gl.h",具体情况要看你到底把头文件放到哪了)

glew 包含了最新的gl和glu
<GL/gl.h>:OpenGL所使用的函数和常量声明。

<GL/glu.h>:GLU(OpenGL实用库)所使用的函数和常量声明。GLU库属于OpenGL标准的一部分。(以下各种库则不属于)

<GL/glaux.h>:GLAUX(OpenGL辅助库)所使用的函数和常量声明。这个库提供了创建窗口,处理键盘和鼠标事件,设置调色板等OpenGL本身不提供,但在编写OpenGL程序时又经常用到的功能。目前这个库已经过时,只有比较少的编译环境中有提供,例如VC系列。在VC系列编译器中,使用这个头文件之前必须使用#include <windows.h>或者具有类似功能的头文件。

<GL/glut.h>:GLUT(OpenGL实用工具包)所使用的函数和常量声明。这个库的功能大致与GLAUX类似,目前许多OpenGL教程使用这个库来编写演示程序。一些编译系统可能不直接提供这个库(例如VC系列),需要单独下载安装。这个头文件自动包含了<GL/gl.h>和<GL/glu.h>,编程时不必再次包含它们。

<GL/glext.h>:扩展头文件。因为微软公司对OpenGL的支持不太积极,VC系列编译器虽然有<GL/gl.h>这个头文件,但是里面只有OpenGL 1.1版本中所规定的内容,而没有OpenGL 1.2及其以后版本。对当前的计算机配置而言,几乎都支持OpenGL 1.4版本,更高的则到1.5, 2.0, 2.1,而VC无法直接使用这些功能。为了解决这一问题,就有了<GL/glext.h>头文件。这个头文件提供了高版本OpenGL所需要的各种常数声明以及函数指针声明。

<GL/wglext.h>:扩展头文件。与<GL/glext.h>类似,但这个头文件中只提供适用于Windows系统的各种OpenGL扩展所使用的函数和常量,不适用于其它操作系统。

"glee.h":GLEE开源库的头文件。它的出现是因为<GL/glext.h>虽然可以使用高版本的OpenGL函数,但是使用的形式不太方便。GLEE库则让高版本的OpenGL函数与其它OpenGL函数在使用上同样方便。需要注意的是,这个头文件与<GL/gl.h>是冲突的,在包含"glee.h"之前,不应该包含<GL/gl.h>。
#include <GL/glut.h>
#include "glee.h"   // 错误,因为glut.h中含有gl.h,它与glee.h冲突
                    // 但是如果把两个include顺序交换,则正确
"glos.h":虽然这个也时常见到,但我也不知道它到底是什么,可能是与系统相关的各种功能,也可能只是自己编写的一个文件。我曾经看到一个glos.h头文件中只有一句#include <GL/glut.h>。

 

 

 

SDL GLFW GLUT(freeGlut) SFML创建窗口管理输入

 

原创粉丝点击