OpenGL学习14-16
- 格式:doc
- 大小:89.00 KB
- 文档页数:16
OpenGL学习:第一课先了解一下OpenGL中对数据类型的定义,对后面使用一些库函数会有所帮助的。
打开gl.h文件,就可以看到OpenGL定义的一些基本数据类型,如下所示:typedef unsigned int GLenum;typedef unsigned char GLboolean;typedef unsigned int GLbitfield;typedef signed char GLbyte;typedef short GLshort;typedef int GLint;typedef int GLsizei;typedef unsigned char GLubyte;typedef unsigned short GLushort;typedef unsigned int GLuint;typedef float GLfloat;typedef float GLclampf;typedef double GLdouble;typedef double GLclampd;typedef void GLvoid;先从最简单的学习。
点是OpenGL中最基本最简单的图元,它不像数学中的点是要无穷小的,它是有大小的,大小默认为1个像素,但也可以改变。
改变一个点的大小,函数名称为glPointSize,其函数声明如下:WINGDIAPI void APIENTRY glPointSize (GLfloat size);你仍然可以到gl.h中查看该函数的声明。
函数声明中,size是点的大小,默认值为1.0f,单位为“像素”,而且,size 必须要大于0.0f,原因很简单了,如果等于0了,你又怎么能在图形显示设备上看到点的存在呢。
为了学习方便,使用VC 6.0进行调试学习。
首先,新建一个Win32 Console Application,切换到Fileview视图,在Source Files中新建一个C++源文件,然后就可以在这个源文件中进行调试学习。
OpenGL教程在这个系列讲座中介绍了有关OpenGL的基本知识,主要涉及颜色、绘制几何体、坐标变换、堆栈操作、显示列表、光照和材质、纹理映射、特殊效果、曲面和曲线的绘制、二次几何体绘制、像素操作、如何绘制动画物体及菜单管理。
通过对讲座中提供的实例的理解消化,读者可以较容易地进入OpenGL的世界。
第一讲基本概念前言随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使用计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥自身的创造性思维,通过人机交互来模拟、改造现实世界,这就是目前最为时髦的虚拟现实技术。
通过这种技术,建筑工程师可以直接设计出美观的楼房模型;军事指挥员可以模拟战场进行军事推演,网民可以足不出户游览故宫博物馆等名胜古迹等。
而虚拟现实技术最重要的一部分内容就是三维图形编程。
当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口,并广泛应用于游戏开发、建筑、产品设计、医学、地球科学、流体力学等领域。
值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL可以在微机中广泛应用。
目前,OpenGL在国内外都掀起了热潮,但国内对这一领域介绍的资料并不是很多,特别是有志于在图形图像方面进行深入研究的读者朋友,常常苦于不掌握OpenGL编程接口技术,无法向纵深领域扩展。
为了开启三维图形编程这扇神秘大门,本讲座在结合OpenGL有关理论知识的基础上,着重介绍Visual C++6.0开发环境中的编程实现,由于水平有限,本讲座可能无法面面俱到,存在一些疏漏,但相信它可以将开启"神秘大门"的钥匙交给读者朋友们。
一、OpenGL的特点及功能OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用OpenGL高质量、高性能的特点。
第一章 OpenGL 概览§1.1OpenGL 是什么 1. OpenGL 是一个通用共享的开放式三维图形标准2. OpenGL 是一个开放的针对于图形硬件的三维图形软件包,是图形硬件的软件接口3. OpenGL 是指令和函数的集合(从程序员的角度看),是一个优秀的专业化的 3D 的 API§1.2OpenGL 能作什么 1. 建模。
2. 变换 3. 颜色模式设置 4. 光照和材质设置 5. 纹理映射 6. 位图显示和图像增强 7. 双缓存动画§1.3OpenGL 函数语法 1) 所有 OpenGL 函数都以 gl 作为前,且词首字母大写(如glClearColor()函数); 2) OpenGL 中定义的常数都以 GL 开头,所有的字母都大写,且单词之间以下划线来分隔(例如 GL_COLOR_BUFFER_BIT); 3) OpenGL 命令(OpenGL 函数常被称为 OpenGL 命令)常常带有后。
如:glColor3f()和 glVertex3f()中的后 3f;后指示出该函数的参数的个数和类型,其中 3 表示该函数需要 3 个参数,f 表示参数为浮点型数值。
对于同一个功能函数,由于后的不同,可以有多种不同形式的函数(如:glVertex2i()、glVertex2f()、glVertex3f()、glVertex3d()、glVertex4f()、glVertex4fv()等)。
某些 OpenGL 函数可以接受多至 8 种不同的数据类型作为它们的参数。
表 1-1 列出了命令后的类型和相应的 OpenGL 的类型。
4) 有一些 OpenGL 函数的后面带有一个字母 v。
这表示该命令带有的是一个指向矢量(即数组)值的指针参数。
如:Glfloat color_array [] = { 1.0,1.0,1.0 }; glColor3fv(color_array); 以数组名 color_array 为参数,该命令等价于 glColor3f(1.0,1.0,1.0);后定义数据类型 C 语言类型 OpenGL 类型定义b 8 位整数 signed char GLbyte s 16 位整数 short GLshort i 32 位整数 long GLint, GLsizei f 32 位浮点数 float GLfloat, GLcampf d 64 位浮点数 double GLdouble, GLclampd ub 8 位无符号整数 unsigned char GLubyte, GLboolean us 16 位无符号整数 unsigned short GLushort ui 32 位无符号整数 unsigned long GLuint, GLenum, GLbitfield 表1-1命令后参数数据类型第 2 页OpenGL 程序设计讲稿中国地质大学(北京)地球物理与信息技术学院§1.4OpenGL 状态机制 1.2.OpenGL 是一个状态机。
OpenGL基础图形编程- 总目录出处:中国游戏开发者[ 2001-09-20 ]作者:总目录第一章OpenGL与三维图形世界1.1 OpenGL使人们进入三维图形世界1.2 OpenGL提供直观的三维图形开发环境1.3 OpenGL称为目前三维图形开发标准第二章OpenGL概念建立2.1 OpenGL基本理解2.2 OpenGL工作流程2.3 OpenGL图形操作步骤第三章Windows NT环境下的OpenGL3.1 Windows NT下的OpenGL函数3.2 OpenGL基本功能3.3 Windows NT下OpenGL结构第四章OpenGL基本程序结构第五章OpenGL数据类型和函数名第六章OpenGL辅助库的基本使用6.1 辅助库函数分类6.2 辅助库应用示例第七章OpenGL建模7.1 描述图元7.1.1 齐次坐标7.1.2 点7.1.3 线7.1.4 多边形7.2 绘制图元7.2.1 定义顶点7.2.2 构造几何图元第八章OpenGL变换8.1 从三维空间到二维平面8.1.1 相机模拟8.1.2 三维图形显示流程8.1.3 基本变换简单分析8.2 几何变换8.2.1 两个矩阵函数解释8.2.2 平移8.2.3 旋转8.2.4 缩放和反射8.2.5 几何变换举例8.3 投影变换8.3.1 正射投影8.3.2 透视投影8.4 裁剪变换8.5 视口变换8.6 堆栈操作第九章OpenGL颜色9.1 计算机颜色9.1.1 颜色生成原理9.1.2 RGB色立体9.2 颜色模式9.2.1 RGBA模式9.2.2 颜色表模式9.2.3 两种模式应用场合9.3 颜色应用举例第十章OpenGL光照10.1 真实感图形基本概念10.2 光照模型10.2.1 简单光照模型10.2.2 OpenGL光组成10.2.3 创建光源10.2.4 启动光照10.3 明暗处理10.4 材质10.4.1 材质颜色10.4.2 材质定义10.4.3 材质RGB值和光源RGB值的关系10.4.4 材质改变第十一章OpenGL位图和图像11.1 位图11.1.1 位图和字符11.1.2 当前光栅位置11.1.3 位图显示11.2 图像11.2.1 象素读写11.2.2 象素拷贝11.2.3 图像缩放11.2.4 图像例程第十二章OpenGL纹理12.1 基本步骤12.2 纹理定义12.3 纹理控制12.3.1 滤波12.3.2 重复与约简12.4 映射方式12.5 纹理坐标12.5.1 坐标定义12.5.2 坐标自动产生第十三章OpenGL复杂物体建模13.1 图元扩展13.1.1 点和线13.1.2 多边形13.2 法向计算13.2.1 法向基本计算方法13.2.2 法向定义13.3 曲线生成13.3.1 曲线绘制举例13.3.2 曲线定义和启动13.3.3 曲线坐标计算13.3.4 定义均匀间隔曲线坐标值13.4 曲面构造13.4.1 曲面定义和坐标计算13.4.2 定义均匀间隔的曲面坐标值13.4.3 纹理曲面13.4.4 NURBS曲面第十四章OpenGL特殊光处理14.1 光照模型14.1.1 全局环境光14.1.2 近视点与无穷远视点14.1.3 双面光照14.2 光源位置与衰减14.3 聚光与多光源14.3.1 聚光14.3.2 多光源与例程14.4 光源位置与方向的控制14.5 辐射光第十五章OpenGL效果处理15.1 融合15.1.1 Alpha值与融合15.1.2 融合因子15.1.3 融合实例15.2 反走样15.2.1 行为控制函数15.2.2 点和线的反走样15.2.3 多边形的反走样15.3 雾15.3.1 雾的概论和例程15.3.2 雾化步骤第十六章OpenGL显示列表16.1 显示列表概论16.1.1 显示列表的优势16.1.2 显示列表的适用场合16.2 创建和执行显示列表16.2.1 创建显示列表16.2.2 执行显示列表16.3 管理显示列表16.4 多级显示列表第十七章OpenGL帧缓存和动画17.1 帧缓存17.1.1 帧缓存组成17.1.2 缓存清除17.2 动画【下页】【打印】【关闭】[ 字号:大·中·小]OpenGL基础图形编程- OpenGL与3D图形世界出处:中国游戏开发者[ 2001-09-20 ]作者:目录1.1 OpenGL使人们进入三维图形世界1.2 OpenGL提供直观的三维图形开发环境1.3 OpenGL成为目前三维图形开发标准1.1、OpenGL使人们进入三维图形世界我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体。
OpenGL•OpenGL是一种图形应用程序编程接口(Application Programming Interface,API)。
它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,完全通过软件的方式实现OpenGL的接口。
OpenGL ES•OpenGL®ES is a royalty-free, cross-platform API for rendering advanced 2D and 3D graphics on embedded and mobile systems - including consoles, phones, appliances and vehicles. It consists of a well-defined subset of desktop OpenGL suitable for low-power devices, and provides a flexible and powerful interface between software and graphics acceleration hardware.•是OpenGL的子集,本质上是编程接口规范。
•OpenGL与OpenGL ES的主要区别,在于OpenGL ES主要针对嵌入式设备使用OpenGLES 3.0•OpenGLES 3.0 实际上是 OpenGLES 2.0 的扩展版本,向下兼容 OpenGLES 2.0 ,但不兼容 OpenGLES 1.0 。
图形API汇总•OpenGL(Open Graphics Library):是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。
OpenGL快速⼊门掌握相关概念本⽂的⽬录1 图形API简介2 图形API能够解决的问题3 图形API的学习⽬标4 OpenGL中需要掌握的专业名词5 OpenGL需要了解的坐标系6 图形/图⽚从⽂件渲染到屏幕过程解析7 推荐OpenGL的蓝宝书和红宝书⼀图形API简介 OpenGL(OpenGL Graphics Library)是⼀个跨编程语⾔、跨平台的编程图形程序接⼝,它将计算机的资源抽象成为⼀个个OpenGL对象,对这些资源的操作抽象为⼀个个OpenGL指令。
那么OpenGL的跨平台是如何做到的呢?其⼀是与系统⽆关:OpenGL只是定义与图形绘制相关的API,⽽不管系统如何使⽤这些API。
⼀个显⽽易见的例⼦就是窗⼝,如果只是⽤纯粹的OpenGL函数,基本上没办法实现展⽰的效果,因为OpenGL没有定义如何将绘图得到的结果展⽰到显⽰屏或者打印机上,这部分显⽰牵扯到具体的操作系统。
也就是说,OpenGL的实现是具体的操作系统做的。
其⼆是与硬件⽆关:OpenGL只定义API的形式,⽽没有给定实现的细节,这样就允许不同的硬件根据各⾃的细节实现这些API。
OpenGL ES(OpenGL for Embedded Systems)是OpenGL三维图形API的⼦集,针对⼿机、PAD和游戏主机等嵌⼊式设备⽽设计,去除了许多不必要和性能较低的API接⼝。
作为iOS开发者⼀般使⽤的就是OpenGL ES(相对于使⽤OpenGL)。
DirectX是有很多API组成,DirectX并不是⼀个单纯的图形API,最重要的是DirectX是属于Windows上⼀个多媒体处理API,并不⽀持Windows以外的平台,所以不是跨平台框架,按照性质分类,可以分为4⼤部分,显⽰部分、声⾳部分、输⼊部分、⽹络部分。
在游戏⾥见得会多⼀点。
Metal是苹果为游戏开发者推出的新的平台技术,该技术能够为3D图像提⾼10倍的渲染性能,Metal是苹果为了解决3D渲染⽽推出的框架。
OpenGL学习手册内部交流>>>======虾皮工作室======<<<csAxp目录第01课 创建一个OpenGL窗口 (2)第02课 多边形 (22)第03课 添加颜色 (25)第04课 旋转 (27)第05课 3D空间 (30)第06课 纹理映射 (35)第07课 光照和键盘控制 (43)第08课 混合 (54)第09课 3D空间中移动图像 (57)第10课 3D世界 (66)第11课 飘动的旗帜 (73)第12课 显示列表 (78)第13课 图像字体 (85)第14课 图形字体 (93)第15课 纹理图形字 (99)第16课 雾 (104)第17课 2D图像文字 (106)第18课 二次几何体 (117)第19课 粒子系统 (123)第01课 创建一个OpenGL窗口在这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.理解OpenGL如何工作非常重要,你可以在教程的末尾下载源程序,但我强烈建议你至少读一遍教程,然后再开始编程。
第一件事是打开VC然后创建一个新工程。
如果您不知道如何创建的话,您也许不该学习OpenGL,而应该先学学VC。
某些版本的VC需要将 bool 改成 BOOL , true 改成 TRUE , false 改成 FALSE ,请自行修改。
在您创建一个新的Win32程序(不是console控制台程序)后,您还需要链接OpenGL库文件。
在VC中操作如下:Project-> Settings,然后单击LINK标签。
在"Object/Library Modules"选项中的开始处(在 kernel32.lib 前)增加 OpenGL32.lib GLu32.lib 和 GLaux.lib 后单击OK按钮。
OpenGL入门学习(十四)OpenGL从推出到现在,已经有相当长的一段时间了。
其间,OpenGL不断的得到更新。
到今天为止,正式的OpenGL已经有九个版本。
(1.0, 1.1, 1.2, 1.2.1, 1.3, 1.4, 1.5, 2.0, 2.1)每个OpenGL版本的推出,都增加了一些当时流行的或者迫切需要的新功能。
同时,到现在为止,OpenGL 是向下兼容的,就是说如果某个功能在一个低版本中存在,则在更高版本中也一定存在。
这一特性也为我们编程提供了一点方便。
当前OpenGL的最新版本是OpenGL 2.1,但是并不是所有的计算机系统都有这样最新版本的OpenGL实现。
举例来说,Windows系统如果没有安装显卡驱动,或者显卡驱动中没有附带OpenGL,则Windows系统默认提供一个软件实现的OpenGL,它没有使用硬件加速,因此速度可能较慢,版本也很低,仅支持1.1版本(听说Windows Vista默认提供的OpenGL支持到1.4版本,我也不太清楚)。
nVidia和ATI这样的显卡巨头,其主流显卡基本上都提供了对OpenGL 2.1的支持。
但一些旧型号的显卡因为性能不足等原因,只能支持到OpenGL 2.0或者OpenGL 1.5。
Intel的集成显卡,很多都只提供了OpenGL 1.4(据说目前也有更高版本的了,但是我没有见到)。
OpenGL 2.0是一次比较大的改动,也因此升级了主版本号。
可以认为OpenGL 2.0版本是一个分水岭,是否支持OpenGL 2.0版本,直接关系到运行OpenGL程序时的效果。
如果要类比一下的话,我觉得OpenGL 1.5和OpenGL 2.0的差距,就像是DirectX 8.1和DirectX 9.0c的差距了。
检查自己的OpenGL版本可以很容易的知道自己系统中的OpenGL版本,方法就是调用glGetString函数。
const char* version = (const char*)glGetString(GL_VERSION);printf("OpenGL 版本:%s\n", version);glGetString(GL_VERSION);会返回一个表示版本的字符串,字符串的格式为X.X.X,就是三个整数,用小数点隔开,第一个数表示OpenGL主版本号,第二个数表示OpenGL次版本号,第三个数表示厂商发行代号。
比如我在运行时得到的是"2.0.1",这表示我的OpenGL版本为2.0(主版本号为2,次版本号为0),是厂商的第一个发行版本。
通过sscanf函数,也可以把字符串分成三个整数,以便详细的进行判断。
int main_version, sub_version, release_version;const char* version = (const char*)glGetString(GL_VERSION);sscanf(version, "%d.%d.%d", &main_version, &sub_version, &release_version);printf("OpenGL 版本:%s\n", version);printf("主版本号:%d\n", main_version);printf("次版本号:%d\n", sub_version);printf("发行版本号:%d\n", release_version);glGetString还可以取得其它的字符串。
glGetString(GL_VENDOR); 返回OpenGL的提供厂商。
glGetString(GL_RENDERER); 返回执行OpenGL渲染的设备,通常就是显卡的名字。
glGetString(GL_EXTENSIONS); 返回所支持的所有扩展,每两个扩展之间用空格隔开。
详细情况参见下面的关于“OpenGL扩展”的叙述。
版本简要历史版本不同,提供功能的多少就不同。
这里列出每个OpenGL版本推出时,所增加的主要功能。
当然每个版本的修改并不只是下面的内容,读者如果需要知道更详细的情形,可以查阅OpenGL标准。
OpenGL 1.1顶点数组。
把所有的顶点数据(颜色、纹理坐标、顶点坐标等)都放到数组中,可以大大的减少诸如glColor*, glVertex*等函数的调用次数。
虽然显示列表也可以减少这些函数的调用次数,但是显示列表中的数据是不可以修改的,顶点数组中的数据则可以修改。
纹理对象。
把纹理作为对象来管理,同一时间OpenGL可以保存多个纹理(但只使用其中一个)。
以前没有纹理对象时,OpenGL只能保存一个“当前纹理”。
要使用其它纹理时,只能抛弃当前的纹理,重新载入。
原来的方式非常影响效率。
OpenGL 1.2三维纹理。
以前的OpenGL只支持一维、二维纹理。
像素格式。
新增加了GL_BGRA等原来没有的像素格式。
允许压缩的像素格式,例如GL_UNSIGNED_SHORT_5_5_5_1格式,表示两个字节,存放RGBA数据,其中R, G, B各占5个二进制位,A 占一个二进制位。
图像处理。
新增了一个“图像处理子集”,提供一些图像处理的专用功能,例如卷积、计算柱状图等。
这个子集虽然是标准规定,但是OpenGL实现时也可以选择不支持它。
OpenGL 1.2.1没有加入任何新的功能。
但是引入了“ARB扩展”的概念。
详细情况参见下面的关于“OpenGL扩展”的叙述。
OpenGL 1.3压缩纹理。
在处理纹理时,使用压缩后的纹理而不是纹理本身,这样可以节省空间(节省显存)和传输带宽(节省从内存到显存的数据流量)多重纹理。
同时使用多个纹理。
多重采样。
一种全屏抗锯齿技术,使用后可以让画面显示更加平滑,减轻锯齿现象。
对于nvidia显卡,在设置时有一项“3D平滑处理设置”,实际上就是多重采样。
通常可以选择2x, 4x,高性能的显卡也可以选择8x, 16x。
其它显卡也几乎都有类似的设置选项,但是也有的显卡不支持多重采样,所以是0x。
OpenGL 1.4深度纹理。
可以把深度值像像素值一样放到纹理中,在绘制阴影时特别有用。
辅助颜色。
顶点除了有颜色外还有辅助颜色。
在使用光照时可以表现出更真实的效果。
OpenGL 1.5缓冲对象。
允许把数据(主要指顶点数据)交由OpenGL保存到较高性能的存储器中,提高绘制速度。
比顶点数组有更多优势。
顶点数组只是减少函数调用次数,缓冲对象不仅减少函数调用次数,还加快数据访问速度。
遮挡查询。
可以计算一个物体有几个像素会被绘制到屏幕上。
如果物体没有任何像素会被绘制,则不需要加载相关的数据(例如纹理数据)。
OpenGL 2.0可编程着色。
允许编写一小段代码来代替OpenGL原来的顶点操作/片段操作。
这样提供了巨大的灵活性,可以实现各种各样的丰富的效果。
纹理大小不再必须是2的整数次方。
点块纹理。
把纹理应用到一个点(大小可能不只一个像素)上,这样比绘制一个矩形可能效率更高。
OpenGL 2.1可编程着色,编程语言由原来的1.0版本升级为1.2版本。
缓冲对象,原来仅允许存放顶点数据,现在也允许存放像素数据。
获得新版本的OpenGL要获得新版本OpenGL,首先应该登陆你的显卡厂商网站,并查询相关的最新信息。
根据情况,下载最新的驱动或者OpenGL软件包。
如果自己的显卡不支持高版本的OpenGL,或者自己的操作系统根本就没有提供OpenGL,怎么办呢?有一个被称为MESA的开源项目,用C语言编写了一个OpenGL实现,最新的mesa 7.0已经实现了OpenGL 2.1标准中所规定的各种功能。
下载MESA的代码,然后编译,就可以得到一个最新版本的OpenGL了。
呵呵,不要高兴的太早。
MESA是软件实现的,就是说没有用到硬件加速,因此运行起来会较慢,尤其是使用新版本的OpenGL所规定的一些高级特性时,慢得几乎无法忍受。
MESA不能让你用旧的显卡玩新的游戏(很可能慢得没法玩),但是如果你只是想学习或尝试一下新版本OpenGL的各种功能,MESA可以满足你的一部分要求。
OpenGL扩展OpenGL版本的更新并不快。
如果某种技术变得流行起来,但是OpenGL标准中又没有相关的规定对这种技术提供支持,那就只能通过扩展来实现了。
厂商在发行OpenGL时,除了遵照OpenGL标准,提供标准所规定的各种功能外,往往还提供其它一些额外的功能,这就是扩展。
扩展的存在,使得各种新的技术可以迅速的被应用到OpenGL中。
比如“多重纹理”,它是在OpenGL 1.3中才被加入到标准中的,在OpenGL 1.3出现以前,很多OpenGL实现都通过扩展来支持“多重纹理”。
这样,即使OpenGL版本不更新,只要增加新的扩展,也可以提供新的功能了。
这也说明,即使OpenGL版本较低,也不一定不支持一些高版本OpenGL才提供的功能。
实际上某些OpenGL 1.5的实现,也可能提供了最新的OpenGL 2.1版本所规定的大部分功能。
当然扩展也有缺点,那就是程序在运行的时候必须检查每个扩展功能是否被支持,导致编写程序代码复杂。
扩展的名字每个OpenGL扩展,都必须向OpenGL的网站注册,确认后才能成为扩展。
注册后的扩展有编号和名字。
编号仅仅是一个序号,名字则与扩展所提供的功能相关。
名字用下划线分为三部分。
举例来说,一个扩展的名字可能为:GL_NV_half_float,其意义如下:第一部分为扩展的目标。
比如GL表示这是一个OpenGL扩展。
如果是WGL则表示这是一个针对Windows的OpenGL扩展,如果是GLX则表示这是一个针对linux的X Window系统的OpenGL扩展。
第二部分为提供扩展的厂商。
比如NV表示这是nVidia公司所提供的扩展。
相应的还有ATI, IBM, SGI, APPLE, MESA等。
剩下的部分就表示扩展所提供的内容了。
比如half_float,表示半精度的浮点数,每个浮点数的精度只有单精度浮点数的一半,因此只需要两个字节就可以保存。
这种扩展功能可以节省内存空间,也节省从内存到显卡的数据传输量,代价就是精确度有所降低。
EXT扩展和ARB扩展最初的时候,每个厂商都提供自己的扩展。
这样导致的结果就是,即使是提供相同的功能,不同的厂商却提供不同的扩展,这样在编写程序的时候,使用一种功能就需要依次检查每个可能支持这种功能的扩展,非常繁琐。
于是出现了EXT扩展和ARB扩展。
EXT扩展是由多个厂商共同协商后形成的扩展,在扩展名字中,“提供扩展的厂商”一栏将不再是具体的厂商名,而是EXT三个字母。