opengles规范基础知识Word文档下载推荐.docx
《opengles规范基础知识Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《opengles规范基础知识Word文档下载推荐.docx(36页珍藏版)》请在冰豆网上搜索。
当程序不连接任何一个context时,运行GL命令会导致未定义的行为。
GL命令的通过窗口系统最大限度的控制帧缓存,窗口系统决定GL在给定的时间内可以访问帧缓存中的哪些点,它还负责与GL交流点的数据结构。
因此,没有任何GL命令去定义帧缓存或者初始化GL。
同样,在CRT或者LCD上帧缓存的显示内容(包括某些技术进行的单独帧缓存值变换,例如gamma纠错)是不被定位到GL中。
帧缓存构造发生在GL的外部,同窗口系统相关联。
GL的初始化发生在窗口系统为GL分配一个窗口时。
EGLAPI定义了一个简便的途径创建GLcontexts和窗口,该窗口可用于连接不同平台的窗口系统。
GL被设计成运行可以运行在一系列图形平台上,并提高图形显示的效果和性能。
为了适应多样性,某些GL操作使用理想行为代替了实行行为,因为背叛这种设想是允许的,也规定了一个实现必须遵守的规则使其接近理想的行为。
在GL中,这个允许的变化指2个完全不同的GL的实现可以出现像素到像素的不一致,即便相同的输入,或者相同帧缓存配置下。
最后,命令的名字,常数和类型都是用GL作前缀(可以为gl,GL_,GL),这样可以减少与其他包出现姓名冲突。
在以后的文档中,前缀可能被省略。
数值计算
GL操作中必须进行一些数值运算。
Commonprofile下,通常使用浮点数计算,浮点数的范围将在后面的“浮点计算”中有精确的定义。
Commonliteprofile下,通常使用定点数计算,顶点数的范围将在后面的“定点运算”中做更精确的定义,但是也它也可以使用浮点数来计算。
浮点计算
我们不规定浮点数是如何表现的,它们的操作是如何执行的。
我们简单的要求数字浮点部分包含足够的比特位和足够大的指数位,所有单独浮点操作结果都精确到1/105。
浮点数用来表示位置和规格化坐标时,最重要的是至少精确到232。
表示颜色或者纹理坐标,最少精确到210。
其他浮点数至少精确到232。
x.0=0.x=0
1.x=x.1=x
x+0=0+x
00=1
大部分单精度浮点格式需要满足这些要求。
任何浮点数作为GL命令的输入是合法的,如果提供一个浮点数是未定义的,但是必须保证不会导致GL中断或者结束。
在IEEE计算中,例如,对GL命令输入一个负零或者一个未规格化数会产生可预知的结果,而提供NaN或者无穷大会产生未定义的结果。
如果x的值不是一个浮点数,以上一致性的规定不需要保持。
定点数计算
内部计算可以即可以使用定点计算,也可以使用浮点计算。
定点计算必须精确在±
2-15。
定点数表示位置或者规格化坐标必须精确到215;
表示颜色或者纹理坐标必须精确到210。
其他定点值必须精确到215。
x.0=0.x=0
1.x=x.1=x;
x+0=0+x=x
定点数可能导致上溢出或者下溢出,计算的结果是未被定义的,但是不能导致GL中断或者终止。
通常要求
以下的限制对所有的实现都必须被遵守,无论使用浮点数还是定点数计算。
32比特位按照16.16划分,16表示分数,16表示整数位。
如果一个顶点使用16.16表示,模型视图和映射矩阵用16.16表示,视野空间和规格化设备坐标空间的点用16.16表示(计算过程中的表达式可以使用充足的动态范围),然后变换管线必须计算视野空间和规格化设备坐标空间的点是有理由的精确(例如:
溢出是不被接受的)。
一些计算需要除法。
因为某些原因(包括矢量规格化中隐含的除法),除零会导致一个未定义的结果,但是不能导致GL中断或者终止。
GL状态GL拥有相当多的状态。
这份文档列举了每个状态变量,并且描述了如何改变这些变量。
为了方便讨论,状态变量根据功能被归类。
虽然GL操作在帧缓存中执行,但是帧缓存不属于GL状态。
虽然GL的实现可能依赖于硬件,该规范不依赖于任何特别实现GL的硬件,因此我们关注于图形卡与GL精确通信后的状态。
GL命令语法GL命令是函数或者程序。
各种不同的命令组执行着同样的操作,但是区别于提供不同的参数。
为了方便的提供这种变化,我们采纳一种标记法来描述命令和他们的参数。
GL命令是按照下面的格式来命名的,依赖于4个特别的字母。
第一个字母指示必须提供给命令的参数的数量,第二个字母指示参数的类型:
8比特位的整数,32比特位的整数,32比特位的顶点数,或者单精度的浮点数。
最后一个字母,如果是v,它指示命令需要一个指针参数,该参数指向一个数组(一个向量),而不是一系列的单独参数。
以下是2个例子:
voidColor4f(floatr,floatg,floatb,floata);
和
voidGetFloatv(enumvalue,float*data);
这些例子显示了ANSIC对这些命令的申明,通常一个命令的申明使用如下格式:
rtypeName{∈1234}{∈ixfubui}{∈v}([args,]Targ1,:
:
TargN[,args]);
rtype表示函数返回值,{}包括了一系列的字母或者字母对,它们是多选一的关系。
∈不表示字母。
括号中的参数([args,]和[,args])表示是可选的。
从第arg1到argN个参数的类型都是T,T的代表的具体意义在Table2.1中描述(如果是表中不存在的字母,可能这个参数的类型已经被明确了的)。
如果最后一个字母不是v,N可能是1,2,3,4(如果这里没有数字,参数的数目一定是明确的)。
Letter
CorrespondingGLType
i
int
x
fixed
f
float
ub
ubyte
ui
uint
Table2.1:
CorrespondenceofcommandsuffixletterstoGLargumenttypes.RefertoTable2.2fordefinitionsoftheGLtypes.
如果最后一个字母是v,此时只有参数arg1,它是一个含有N个指定类型值的数组,最后,我们指明一个无符号类型使用u做前缀(因此,unsignedint被缩写成uint)。
例如,
voidNormal3{xf}(Tag);
代表2个声明
voidNormal3f(floatarg1,floatarg2,floatarg3);
voidNormal3x(fixedarg1,fixedarg2,fixedarg3);
fixed类型的参数是Table2.2中13种类型中的一个,或者指向其中某种类型。
GL类型到特定语言数据类型的映射是语言绑定声明的一部分,它可能与平台相关,各种不同数据类型的实际和正式参数的类型转换或者类型提升,都依赖于语言绑定的平台。
例如,C语言包括自动转换在整型和浮点数据类型,但是不包括int和fixed,或者float到fixedGL数据类型的转换,因为fixed得数据类型不是一个清晰地内置类型。
无论何种语言绑定,enum类型可以不做任何缩放转化成定点类型,整型可以通过与216相乘,转化成定点数据类型。
GLType
MinimumBitWidth
Description
boolean
1
Boolean
byte
8
Signedbinaryinteger
Unsignedbinaryinteger
short
16
Signed2’scomplementbinaryinteger
ushort
32
Signed2’scomplementbinaryintege
Signed2’scomplement16.16scaledinteger
clampx
16.16scaledintegerclampedto[0,1]
sizei
Non-negativebinaryintegersize
enum
Enumeratedbinaryintegervalue
intptr
ptrbits
sizeiptr
bitfield
Bitfield
Floating-pointvalue
clampf
Floating-pointvalueclampedto[0,1]
Table2.2:
GL数据类型。
GL类型不是C类型。
因此,例如GL类型int为GLint,它并非一定等同与c语言类型int。
一个实现可能使用比表中指出的数字还要多的比特位去表示一个GL类型。
纠正超过最小范围的整型值是不必要的。
然而ptrbits是一个指针类型必须的比特位数。
换句话说,类型intptr和sizeiptr必须足够大,可以保存任何地址。
基础GL操作
图例2.1显示了一个GL的大纲图表。
GL命令从左边输入。
一些命令用于几何图形的绘制,另一些用于控制不同场景中的对象。
第一类场景操作是针对原始几何对象:
点、线段和三角形。
它们使用顶点来描述。
在这个场景中,顶点被转换和限制,原始对象被裁减成一个视图的容量,为下一个场景做准备—栅格化。
栅格化构建了一系列的帧缓存地址和值,使用二维描述点、线段、或者三角形。
每个片段的创建是为下个场景提供源。
在他们最终改变到帧缓存中之前,每个场景作为独立的片段运行。
这些操作包括有条件的更新到帧缓存(该操作基于正在到来和先前保存深度值(影响深度缓存)),混合正在到来的片段颜色和先前保存的颜色,遮照和其他的对片段的逻辑操作。
值可能从帧缓存中被读回,或者复制帧缓存的一部分到另一个帧缓存中去,这些传输可能包含某种类型的编解码。
这种分类意味着仅仅使用作为一个工具去描述GL,而不能严格定义GL是如何实现的,我们在这里规定的只是组织各种GL的操作。
GL报错GL仅能探测到所有被考虑到的错误的一个子集,这是因为很多情况下,错误的检查与一个错误-自由程序的实现相违背。
命令:
enumGetError(void);
用于获得错误信息,每个可以探测到错误对应的数字码。
当一个错误被探测到,一个标志将被设置,错误码同时被记录。
很多些的错误发生后,不会影响那些记录码。
当GetError被调用,记录码会被返回,并且错误标志会被清除。
所以一个高级的错误可能会导致重复记录它的错误码。
如果调用GetError返回NO_ERROR,表示从上次调用GetError后(或者在GL初始化前),没有发生可被检测到的错误。
考虑到分配的实现,有可能存在几种的错误-标志码对。
因此,调用GetError后,返回的值,除了NO_ERROR外,每个随后的调用会返回一个可区分的非零标志码,直到所有的非NO_ERROR被返回。
当没有其他非NO_ERROR错误码后,所有的标志位被重置。
这种方案要求一些确切数目的配对(一个比特标志和一个整数)。
初始化时,所有标志都被清除,并且所有代码的被初始化为NO_ERROR。
表2.3总结了所有的GL错误。
当前,当错误标志被设置,只有当OUT_OF_MEMORY发生时,GL的操作结果未定义。
在其他情况下,命令产生的错误被忽略,所以它对当前GL状态或者帧缓存里的内容不产生影响。
如果产生的命令返回一个值,它将返回零。
如果发生的命令需要修改指针参数传来的值,这些值将不会发生任何改变。
这些错误的规定仅应用于GL错误,不应用于系统错误,例如内存访问错误。
这些规定是当前设定的行为,当前GL对错误的行为的定义常常会改变。
在对于每个GL命令描述中,有三个产生错误的条件是绝对的。
第一,如果一个命令需要一个文档中未规定的枚举值,是不允许的.INVALID_ENUM错误会返回。
即使参数是一个指向常量的指针,该值不是命令所允许的。
使用Common或者Common_Liteprofiles中的任意一个常量,如果常量仅被其中一种的profiles定义和接受,也可能出现INVALID_ENUM错误。
第二,当一个参数的类型的sizei是特定的,如果提供一个负数作参数,也会导致INVALID_VALUE错误。
最后,如果当一个命令的执行,导致内存耗尽,错误OUT_OF_MEMORY可能产生。
除此以外的错误,只有在此文档中描述的情况下才会产生。
Error
Offendingcommandignored?
INVALIDENUM
enumargumentoutofrange
Yes
INVALIDVALUE
Numericargumentoutofrange
INVALIDOPERATION
Operationillegalincurrentstate
STACKOVERFLOW
Commandwouldcauseastackoverflow
STACKUNDERFLOW
Commandwouldcauseastackunderflow
OUTOFMEMORY
Notenoughmemorylefttoexe-cutecommand
Unknown
Table2.3:
GL错误概要
简单几何对象和顶点
在GL中,简单几何对象通过一些坐标集合被绘制,这些坐标集合包括顶点和可选的规格化,纹理坐标和颜色。
坐标集合使用顶点数组来定义。
这里定义了七种简单几何对象可以被绘制:
点(包括点精灵),连接的线段(多线段),封闭的线段,单独的线段,多三角形,三角扇形和单独的三角形。
每个顶点被2个,3个或者4个坐标值定义。
另外,当前规格化,多纹理坐标系和当前颜色可以在每个顶点中处理。
规格化通常用于光照的计算。
当前规格化是设置3个坐标值的三维矢量。
纹理坐标决定纹理图如何映射到简单几何物体的表面上。
多纹理坐标系用于定义多个纹理图如何映射到简单几何物体的表面。
纹理集合的数量取决于具体实现,但是至少支持2种。
支持纹理集合的数量可以通过查询MAX_TEXTURE_UNITS获得。
一个颜色值与每个顶点都相连。
这个颜色值即基于当前颜色也受到光照的影响(取决于是否启用光照)。
纹理坐标同样与每个顶点相连,多纹理集合可能与每个顶点相连,图示2.2总结了如何使用变换顶点连接这些辅助的数据,并创建一个处理后的顶点。
图示2.2从顶点坐标数组中和当前值中创建一个处理后顶点。
2个纹理集合被显示。
不过,多纹理可能支持更多数量的集合,这个依赖于具体实现。
当前值是GL状态的一部分。
顶点,规格化和纹理坐标被改变。
颜色可能被影响或者被光照替代,处理结果取决于每个顶点的当前值。
如何处理顶点,规格化,纹理坐标,和颜色的方法和如何规格化,如何映射顶点到2维屏幕,我们将在一会讨论。
在颜色值被指定为顶点之前,需要知道顶点的一些状态:
它的坐标值,它的规格,当前的材质属性和它的多纹理坐标集合。
因为颜色是一个顶点一个顶点指定的,所以一个处理后的顶点包含顶点的坐标,它分配的颜色和它的多纹理坐标集合
图示2.3显示了从一系列的点去建立一个简单几何对象的操作。
但一个简单几何对象形成后,它被视图容器裁剪。
简单几何对象可能被正在改变的顶点坐标,纹理坐标和颜色所改变。
对于线和三角对象,裁剪可能插入新的顶点。
这些顶点定义了简单几何对象如何使用纹理坐标和颜色值栅格化。
图示2.3连接和处理简单几何对象
简单对象的类型
一系列顶点通过命令DrawArrays或者DrawElements传递给GL。
顶点的数量没有限制,取决于顶点数组的长度。
这些命令的模式参数决定在坐标集中绘制对象的类型,类型和并列的模式参数如下:
点:
一系列独立的点在POINTS模式下被定义,每个顶点定义了一个顶点数组中一个单独的点或者点精灵。
多线段:
一系列的一个或着多个连接起来的线段可以在LINE_SRIP模式下被定义,至少提供2个顶点。
因此,第一个顶点定义第一个线段的起始点,第二个顶点定义了第一个线段的结束点,和第二个线段的起始点。
通常情况下,第i个顶点(i>
1),定义了第i个线段的起始点和第i-1条线段的结束点。
最后一个顶点定义了最后一条线段的结束点。
如果仅有一个顶点,不会绘制任何对象。
处理后的顶点所需的状态包括前一个顶点和一个布尔标志——标志当前顶点是否是第一个顶点。
封闭线段:
封闭线段可以使用LINE_LOOP模式来定义。
封闭线段和多线段一样,除了最后一个线段是由最有一个点和第一个点定义的。
需要的状态除了多线段规定的外,还要求包含第一个处理后的顶点。
单独的线段:
单独的线段在LINES模式下,由一对顶点定义。
第一对2个顶点定义了第一条线段,后继的每对定义一条线段。
如果顶点的数量是奇数个,最后一个顶点将被忽略。
需要的状态和多线段一样,但是使用不同:
一个处理好的顶点保持当前线段的第一个结束点,一个布尔标志指明当前顶点是奇数还是偶数(是线段的起始点还是结束点)。
多三角形:
一个多三角形是指多个使用共享边连接在一起的三角形。
这种三角形在TRIANGLE_STRIP模式下,使用多个顶点定义。
因此,首先的3个顶点定义了第一个三角形(它们的顺序很重要),每个后继的顶点定义了一个新的三角形,新三角形的使用前一个三角形的2个顶点和一个新顶点定义。
如果少于3个顶点被定义,将没有任何简单几何对象被构建。
多三角形需要的状态包含一个标志指明是否第一个三角形已创建完毕,2个先前的顶点(称它们为顶点A和定点B),一个比特的指针指明下一个被可替代的顶点。
这个指针初始化指向顶点A,每个后继的顶点移动这个指针。
因此,第一个顶点被保存作为顶点A,第二个顶点被保存,作为顶点B。
第三个顶点保持作为顶点A,按照这个规则继续定义后继的顶点。
第二个以后的任何顶点都将通过顶点A,顶点B和当前顶点,构建一个三角形。
参见图示2.4
扇形多三角形:
一个扇形多三角形和一个多三角形一样,除了:
第一个以后的三角形的构建,永远代替顶点B。
扇形多三角形定义在TRIANGLE_FAN模式下。
单独的三角形:
单独的三角形定义在TRIANGLES模式下。
因此,第3i+1,3i+2和3i+3的顶点定义了第i个三角形。
如果有3n+k个顶点,k为0,1或者2。
如果k不为0,那么最后的k个顶点将被忽略。
对于每个三角形,顶点A是第3i个顶点,顶点B是第3i+1个顶点。
除此之外,单独的三角形和多三角形是一致的。
在多三角形,扇形多三角形,单独的三角形中,顶点的顺序非常重要,它会影响光照和多边形栅格化。
图示2.4(a)一个多三角形
(b)一个扇形多三角形(c)单独的三角形。
图示上的数字代表顶点在定点数组中的顺序。
注意在(a)和(b)边的顺序由第一个三角形定义的,而在(c)中,一个三角形的边独立于其他的三角形
当前顶点状态
当一个顶点数组被定义,但是数据还不可用时,当前值常用于联合顶点辅助的数据。
当前值可能在任何时候被独占命令改变。
使用以下的命令可设置当前的RGBA颜色值。
voidColor4{xf}(Tred,Tgreen,Tblue,Talpha);
voidColor4ub(ubytered,ubytegreen,ubyteblue,ubytealpha);
整型颜色元素(R,G,B,A)到浮点数值的转换将在以后讨论。
Color4f和Color4x通常接受0.0到1.0之间的值,0.0代表最小值,1.0代表最大值(依赖机器)。
超过[0,1]的值不被接受。
当前的规格化使用以下命令。
voidNormal3{xf}(Tnx,Tny,Tnz);
当前的均匀纹理坐标使用一下命令。
voidMultiTexCoord4{xf}(enumtexture,Ts,Tt,Tr,Tq);
当前坐标的设置按照texture参数被修改,s,t,r和q坐标单独设置。
texture是一个TEXTUREi格式的标志常量,指明修改纹理坐标i被修改。
这个常量遵守TEXTUREi=TEXTURE0+i(i在0到k-1的范围内,k是通过MAX_TEXTTURE_UNITS定义的纹理单元的执行依赖数值)。
获取CURRENT_TEXTURE_COORDS返回纹理的坐标设置,该值通过AC