收藏 分享(赏)

opengl翻译(第二章).doc

上传人:yjrm16270 文档编号:6800701 上传时间:2019-04-22 格式:DOC 页数:9 大小:136.31KB
下载 相关 举报
opengl翻译(第二章).doc_第1页
第1页 / 共9页
opengl翻译(第二章).doc_第2页
第2页 / 共9页
opengl翻译(第二章).doc_第3页
第3页 / 共9页
opengl翻译(第二章).doc_第4页
第4页 / 共9页
opengl翻译(第二章).doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、第二章 OpenGL 功能2.1 OpenGL 基础OpenGL(以后简称“GL”)只与渲染帧缓冲有关(并读取这些帧缓冲中有价值的存储信息)。有没有其他外围设备的支持,有时与图形硬件有关,如鼠标,键盘。 程序员必须依靠其他机制,以获取用户输入。GL 的绘制图元受到一系列可选择的模式和着色数方案。每个图元是一个点,线段或多边形。每种模式都可能改为独立;一个设置不会影响其他人的设置(尽管一些模型可能会相互作用从而决定帧缓冲的最终结果)模型被固定,基元被具体化,其他的 GL 操作通过在函数或者程序中传输命令来实现。基础图形被一个或多个顶点组所定义,顶点被定义为一个点,一个边界的端点或者一个多边形两条

2、边的焦点。数据例如位置坐标,颜色,法线,纹理坐标等等。他们都与顶点有关,并且每一个顶点都会被按照同样的方法按顺序独立处理。唯一的例外是如果顶点组被剪裁因此使得基础图形被装在一个特殊的区域;通过这种方法顶点数据将被修改并且新的顶点将被创立。该类型的剪辑依赖于顶点数组所代表的类型。机器会按命令被接收的顺序对他们进行处理,尽管命令在被接收的过程中中会有延迟。这意味着一个基本图形在任何一个与之并行的图形影响到帧缓冲之前就会被完全绘制出来。这同样意味着这也意味着,查询和像素回读操作与所有情况保持一致完成执行此前援引GL 的命令,除非另有明确规定。总体上来说,在任何随后的命令能够产生任何这样的结果之前,之

3、前的 GL 模型或者是帧缓冲上的 GL 命令的结果必须被完成。在 GL 中,数据被绑定在传输中。这意味着数据通过命令的接收来被诠释。即使命令需要指向数据,这些数据在通讯建立的时候将被诠释,并且随后对这些数据的改动将无法影响到 GL(除非同样的指针被用于随后的命令)。GL 提供可以控制包括 3D 和 2D 制图的基础操作命令。这包括应用程序定义的材质参数规格详细列表变换,光照,纹理和着色操作,以及内置的功能,例如抗锯齿和纹理过滤。他并没有提供一种可以描述复杂几何图像的方法。另一种描述这种情况的方法是说 GL 提供了机制来描述复杂几何结构是如何被提供的而不是描述这个复杂图形本身。对于 GL 的命令

4、解释模型,客户端服务器.这些由客户传达的命令将被 GL(服务器)解释和处理。服务器可能会或可能无法在同一计算机作为客户端。在这个意义上说,GL 是“网络透明的。”一个服务器可以维持许多种 GL 语境,每一个语境都被当前的 GL 状态所封装。客户可以选择连接到任何这些语境之一。当程序没有连接到一个语境时,发送 GL 命令将导致无效的状态。GL 的交互类与两帧缓存:视窗提供系统和应用程序建立。在任何时候至多有一个窗口系统提供的帧缓存,被称为默认帧缓冲。应用程序创建的帧缓存,简称为帧缓冲对象,可能会产生应有的作用。这两种类型的帧缓冲的区别主要是配置和管理它们的状态界面。在默认帧缓冲下,窗口系统将控制

5、 GL 命令的最终效果,分配帧缓冲资源,决定默认帧缓冲的位置,GL 命令可能会在任意时间进入,并向 GL 传达这些位置是如何构建的。因此没有 GL 命令来初始化或配置默认帧缓冲。同样的,连接在物理显示设备(包括通过这种技术转化个人帧缓冲的伽马值校正)上的帧缓冲的显示也不会被 GL 定义地址。分配和配置帧缓冲的默认配置在 GL 外进行并连接窗口系统,利用参考 API 在第 1.7.2 节详细介绍。GL 环境的配置和初始化同样要用到这些辅助 API。GL 环境可以和不同的默认帧缓冲相连接,并且在履行这个连接的过程中,一些环境状态将被决定。这可能会用到一个不包括默认帧缓冲的 GL 环境,这将导致帧缓

6、冲对象在整个渲染过程中被执行。这对应用程序执行离层渲染是有利的。GL 被设计为一个拥有强大制图能力,从而可以实现一系列绘图的平台。为了适应这种变化,我们指定理想的行为,而不是为某些 GL 操作的实际行为。与理想的偏差是允许的。我们也可以指定一个可以近似于理想化的行为。这使得 GL 的行为变化被允许,意味着即使在相同的输入呈现相同的运行时帧缓冲的配置,两个不同的 GL 可能无法实现同意像素对像素。 最后,命令名称,连接,典型 GL 前缀(gl,GL_,GL 特别是在 C 中)都是为了减少名字的冲突。为了简明,这些前缀将在文件中被省略。2.1.1 浮点计算在运算过程中,GL 必须执行一系列的浮点运

7、算。在某些时候,这些运算的结果或精度会被限制;由 OpenGL 着色语言规范的着色操作,并且在某些时候会被具体指定的顶点,纹理或者帧缓存数据形式所限制。否则,这种浮点数表示,以及如何对它们进行操作的细节,将不被具体指明。我们的需求十分简单,那就是浮点部分必须有足够的位数并且它的说明文件必须足以容纳个人浮点操作结果的 105 分之 1。用来描述位置,法线和纹理坐标的最大数量级至少为 ;描述颜色的最大数量级至少为 ,其他的浮点描述表示级至少为32 02; 对于任意有限数据320xx, 。 。(偶尔进一步的要求将被指定)大多数单110.x精度浮点格式自动测试系统满足这些要求。特殊的 Inf 和-In

8、f 编译过大无法被表示;NaN 编译“not a number”来自于未被定义的算术操作例如 。在浮点运算中这是允许的,但不是必需的。0任何一个可以表示的浮点值都可以被当做需要浮点数据的命令被输入。提供一个不是浮点值的结果是未定义的,但是不能导致 GL 的中断。在 IEEE 运算中,提供一个负零或者非规格数给 GL 命令可导致可想而知的结果,提供 NaN 或者无限未指定结果。一些计算是需要区分的。在一些情况下(包括一些向量法线的暗含要求),对 0 的计算将产生一个不确定的结果,但必须不导致 GL 的中断。2.1.2 16 位浮点数16 位浮点数有一个标志位(S),五个说明位(E),和 10 个

9、尾数(M)。一个十六位浮点数的值 V 有以下数据决定NaInfSMES,)1(),(2)(,0.102154 0,31,0ME如果浮点数被当做一个整体的 16 位无符号字解释:1024mod102437685odNMES任何一个可表示的 16 位浮点值都可以合法的作为 16 位浮点数据传送给 GL 命令来输入。所提供的值是不是一个浮点数(如 Inf 或 NaN)的这样一个命令的结果是不确定的,但不能导致 GL 中断,提供一个不确定的值或者负零给 GL 会导致超出预测的结果。2.1.3 无符号 11 位浮点数无符号 11 位浮点数没有符号位,有 5 个说明位(E),和六个尾位(M)。11 位浮点

10、数的V 值取决于下式: 0,31)1(2,0,0.645MENaInfME如果浮点数被当做十一位无符号数 64mod64ME当一个浮点数被转换成一个无符号 11 位浮点表示时,有限的值均调整至最接近的可表示的有限值。最少的准度下,目标总是被指向零。这意味着负值将被转化成 0。同样的,定义正值超过 65024(11 位无符号数允许定义的最大值)将被转化成 65024。另外:负无穷将被 0 取代;正无穷则保持原状;正负 NaN 都会被正的 NaN 代替。任何一个可表示的无符号 11 位浮点数都可以作为可接受的 11 位浮点数据传送给 GL 命令。所提供的结果值不是一个浮点数(如 Inf 或 NaN

11、)的这样的命令是不确定的,但绝不能导致 Gl 中断或终止。提供一非规范化数至 GL 必须产生可预见的结果。2.1.4 无符号 10 位浮点数无符号浮点数没有符号位,有 5 位说明位(E),5 个尾位(M)。10 位无符号浮点数 V 值由下式决定: 0,31)1(2,0,0.64532MENaInfVME如果浮点数作为一个无符号 10 位数,32mod32NME当一个浮点数被转换成一个无符号 10 位浮点表示时,有限的值均调整至最接近的可表示的有限值。最少的准度下,目标总是被指向零。这意味着负值将被转化成 0。同样的,定义正值超过 64512(10 位无符号数允许定义的最大值)将被转化成 650

12、24。另外:负无穷将被 0 取代;正无穷则保持原状;正负 NaN 都会被正的 NaN 代替。任何一个可表示的无符号 10 位浮点数都可以作为可接受的 10 位浮点数据传送给 GL 命令。所提供的结果值不是一个浮点数(如 Inf 或 NaN)的这样的命令是不确定的,但绝不能导致 Gl 中断或终止。提供一非规范化数至 GL 必须产生可预见的结果。2.1.5 定点数据变换当一般的顶点特征,像素颜色或者深度成分被作为一个整体表示的时候,他们通常(不是全部)会被作为标准。当修改成或者被修改成浮点数时,标准的整体参数将被视为具体指定。这些数据不是无符号数就是有符号数。在剩余的部分中,b 表示定点数整体表示

13、的位宽度。当整数是在表 2.2 中定义的类型之一。b 是那种类型中所需的最小位宽度。当整体是纹理或者帧缓冲颜色或深度部分时(参看3.8。3),b 是的位数分配给在该纹理或渲染的内部格式的组成部分。当整体是帧缓冲颜色或深度成分(参看第四章)时,b 是的位数在分配帧缓冲的组成部分。对于帧缓冲和帧缓冲 A 部分,如果缓冲没有保存在帧缓冲 A 部分中,或者只有 A 的一位在缓冲时,b 至少要是 2。有符号和无符号定点表示都被认为是 b 位 2 进制整体和各自 2 进制无符号整体。有符号定点表示可被视为有两种方式,正如接下来讨论的。所有下面描述的转换进行定义,即使执行的整数数据类型超过了最小要求范围。从

14、归一固定点转换为浮点无符号规范整形数据应在区间0;1。从无符号规范化定点数 c 转变成相应的浮点数 v 将被如下定义:12bcf(2.1 )有符号定点整形数据应在区间-1;1。从有符号定点数 c 转变成相应的浮点数 f 有两种方式:12bc(2.2 )在这种情况下,全系列的代表使用,以致 对应-1.0 和 对应 1.0。例如,如果1b12bb=8,然后整形数在 -128 对应 -1.0 并且 127 对应 1.0。请注意,这是不可能准确地表达这种表示 0。总体而言,这种表示是用于 GL 正常化签署命令,如顶点属性值,固定点参数。二者选其一的,变化可以采用一下方式:0.1,max21bcf(2.

15、3)在这种情况下,只有区间 被用来表示定点数区间-1,1。例如,如果,1bb=8,整形数-127 对应-1.0 并且 127 对应 1.0。请注意,而零可以准确地表达这种表示,一个值(例如例子中的-128)在能被表示的范围外,再用之前必须被剪切。总体而言,这种表示被用于有符号规范化定点纹理或者帧缓冲数值。在被有符号规范定点数修改的任意地方,如下等式将被用来指定。从一个浮点值转换 F 到相应的无符号标准化固定点值 C 被定义为第一次剪切 F 的范围0,1,然后计算。).12( bf(2.4)f是再转换为无符号二进制整数到底在 b 位。从浮点数 f 转化成有符号规范化定点数 c 有两种方法,每一个

16、都应从在-1;1内的 f 开始。21)( bff(2.5)总体而言,这种转变被用于预订浮点情况(参见第 6 章)和返回整形。二者选其一,转变可能被用于).12( bf(2.6)总体而言,这种转变被用于指定的有符号规范化定点纹理或帧缓冲数。转变之后,f是一个签名,然后转换为二进制补码到底在 b 位二进制整数。在被有符号规范定点数修改的任意地方,如下等式将被用来指定。2.2 GL 状态GL 保持可观的状态。这份文件列举了每一个状态变量,并介绍了如何可以改变每个变量。为了达到讨论的目的,我们按照变量的功能对他们进行了比较武断的分类。虽然我们讨论了 GL 在帧缓存上执行的操作,但是帧缓存并不是 GL

17、情况的一部分。我们要区分两种风格的情况。第一种风格的情况,叫做 GL 服务情况,属于 GL 服务。主要的 GL 情况都在这个领域内。第二种风格的情况,叫做客户情况,属于 GL 客户;除非另有特殊指明,所有状态在本文件中提到的都是 GL 服务状态;GL 客户情况是一个特殊定义。每一个 GL 背景实例意味着一个完整的 GL 服务器的状态设置;每个从客户端连接到服务器意味着两者的 GL 客户端的状态和 GL 服务器状态集。虽然一个是 GL 的实施可能是硬件依赖性,这种讨论于特定的硬件上一个 GL 实现独立。只在绘图硬件的情况严格符合 GL 情况时,我们才关心它。2.2.1 共享对象情况对一个背景组分

18、享确定的情况是可能的。通过窗口系统可以开启背景分享,详细内容参看1.7.2。这些 API 用于创建和管理工作的情况,不在这里进一步讨论。更多有关分享目标的细节讨论在附录 D。除本附录中定义,背景状态中的所有状态只特定于该情况下。2.3 gl 命令语法GL 命令功能或程序。许多组的命令按同样的流程被执行,但是不同在于被执行的程序如何支持他们。为了方便的解释这种变换,我们采用标记法来描述命令和他们的变化。GL 命令形成于,以来实际的命令,详细描述命令的顺序的名称。如果现在,一个数字表示所指示的类型所需的长度(值的数目)。接下来,一个字符串组成一个描述符的类型从表 2.1 显示具体尺寸和参数值的数据

19、类型。最后 v 字符,如果存在,表明该命令需要一个指向数组(矢量)值而不是单个参数系列。下面举两个例子:void Uniform4f( int location, float v0, float v1,float v2, float v3 );andvoid GetFloatv( enum value, float *data );说明符 对应的 GL 符b bytes shorti inti64 int64f floatd doubleub ubyteus ushortui uintUi64 uint64表 2.1:命令后缀类型描述参数对应于 GL 类型。请参阅表四的 GL 类型的定义 2.

20、2。这些例子显示了这些命令的 ANSI C 声明。在一般情况下,命令声明的形式。rtype Namef_1234gf_ b s i i64 f d ub us ui ui64gf_vg( args , T arg1 , : : : , T argN , args );rtype 是函数的返回类型。大括号(FG)的附上型系列描述(见表 2.1),其中一个被选中。表示没有类型说明符。括号中的参数(参数和参数)可能会或可能不会是当前的。在n 个参数 arg1 的通过 argN 有 T 型,相当于类型描述一文表 2.1(如果没有字母,然后参数类型是明确给出)。如果最后一个特征值不是 v,值就会被 1,

21、2,3 或 4 赋值(若果这里没有数字,参数的数量将被固定),如果最后一个特征值是 v,那么只有参数 1 是当前值并且它是指定的 N 值系列的类型。例如:void Uniformf1234gfifg( int location, T value );数字的 8 个说明void Uniform1i( int location, int value );void Uniform1f( int location, float value );void Uniform2i( int location, int v0, int v1 );void Uniform2f( int location, flo

22、at v0, float v1 );void Uniform3i( int location, int v0, int v1, int v2 );void Uniform3f( int location, float v1, float v2,float v2 );void Uniform4i( int location, int v0, int v1, int v2,int v3 );void Uniform4f( int location, float v0, float v1,float v2, float v3 );参数的类型是固定的(即不是由一个在命令后缀表示)GL 所的数据类型之一

23、总结在表2.2,或其中的一个指针类型。2.4 基本 GL 操作图 2.1 为 GL 示意图。命令从左侧进入 GL。有些命令指定要绘制的几何对象,控制对象是如何处理的各个阶段。命令通过处理管道有效地传送。第一阶段工作由几何图元的顶点描述:点,线段和多边形。这些图形的顶点可能会被改变或照亮,在下一阶段,它可以选择性地被使用,几何遮挡,来产生新的图形。最后的结果基元是为下一阶段准备一个观景量,光栅。光栅化产生的帧缓冲的地址和值系列用一个点,线段或多边形二维的描述。每个这样产生的片段被输送到下一个阶段,执行特殊行动碎片才最终改变了帧缓冲。这些操作包括到帧缓冲条件的基础上更新传入和先前储存(对效果的深度

24、缓冲)的深度值,传入的遮掩片段与色彩混合储存的色彩,以及对价值观掩蔽片段和其他逻辑运算。最后,这个值会被从帧缓冲返回或者从一个帧缓冲拷贝到另一个帧缓冲区域。这些变化会伴随着一些编码和解码。这些命令只是描述 GL 的工具,而不是 GL 如何被执行的结构规则,并且我们只是把他们作为一种组织 GL 值操作的方法。目标例如曲面可能会在他们被变换之前被改变。GL Type 最小位宽 描述boolean 1 Booleanbyte 8 Signed twos complement binary integerubyte 8 Unsigned binary integerchar 8 Characters

25、making up stringsshort 16 Signed twos complement binary integerushort 16 Unsigned binary integerint 32 Signed twos complement binary integeruint 32 Unsigned binary integerint64 64 Signed twos complement binary integeruint64 64 Unsigned binary integersizei 32 Non-negative binary integer sizeenum 32 E

26、numerated binary integer valueintptr ptrbits Signed twos complement binary integersizeiptr ptrbits Non-negative binary integer sizesync ptrbits Sync object handle (参看 5.3)bitfield 32 Bit fieldhalf 16Half-precision floating-point valueencoded in an unsigned scalarfloat 32 Floating-point valueclampf 3

27、2 Floating-point value clamped to 0; 1double 64 Floating-point valueclampd 64 Floating-point value clamped to 0; 1表 2.2:GL 数据类型。GL 类型不是 C 类型。因此,举例来说 GL int 类型被包括在 Glint类型文件之外,并且没有必要一定等同于 C int 类型。一个招致可以使用更多的位数比数字显示表中的一个来表示 GL 型。正确解释最小范围以外的整数值并不是必需的。ptrbits 是必须代表一个指针类型的位数,换句话说,IntPtr,sizeiptr,sync 类型必须足够大,以存储任何地址。2.5 GL 错误GL 检测只有那些可以被视为错误条件的子集。这是因为在许多情况下,错误检查会严重影响到没有错误的程序的表达。如下命令enum GetError( void );用于获取错误信息。每个检测到的错误都分配了一个数字代码。当检测到错误,一个标志设置和代码被记录下来。下一个错误,如果存在,不影响本记录代码。当 GetError 被调用,返回的代码和标志被清除,从而使进一步的错误将再次记录其代码。如果调用 GetError 返回 NO_ERROR,然后一直没有检出自上次调用错误 GetError(或自 GL 被初始化)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报