OpenGL 2.0 版正在筹划中,详情见www.opengl.org
支持OpenGL的同志们敬请期待,OpenGL将再次将D3D甩在后面,提供最先进的功能和最有好的编程接口。
OpenGL 2.0由3Dlabs提议
当前主要问题:
系统和图像构筑自1992年来有了重大改变,但OpenGL没有跟上。
越来越感觉到OpenGL(核心)落后于今天先进硬件的功能和性能。
实现和应用的复杂性,导致了今天太多extension。
开发市场产品的需求。
目标:
提升到一个新的高度,以反映今天和不久的将来的显示硬件。(将由核心象D3D一样提供全部硬件功能)
展示下一代可编程图像硬件的图景。(将使用高级语言而不是汇编对显卡编程)
减小对extension的依赖,以可编程性取代复杂性。(由定义良好的核心功能取代大部分扩展功能)
对已有程序保持相当理想的兼容性。(老程序不经修改正常运行,并保持高效)
对不需要兼容性的场合,提供简洁干净的核心。(过时的函数剔除)
处理对动态媒体的需要。(提高动态材质等动态媒体的功能和效率)
新特性:
+标准化已有功能
-PBuffer功能提到核心功能
-包含大部分图象子系统
-集成并标准化WGL,GLX的功能
-大量Extension变为标准功能
+展现全部硬件能力
-使与图像系统的数据交换性能达到极限
-提高并行计算能力
+可编程性
-高级语言对显卡硬件及其他可编程部分编程
-丰富的功能集
-硬件无关
-标准化
-特别为OpenGL设计
+可编程顶点操作
-替代坐标变换,材质应用,光照
-允许任意单顶点操作
+可编程象素操作
-替代材质访问,材质应用,雾
-允许任意单象素操作
+可编程图象格式
-替代图象数据固定的紧缩和反紧缩操作
-允许任意图象类型和格式
+直接支持多通(MultiPass)算法
+更具伸缩性的帧缓冲配置
+离屏(OffScreen)渲染
+由应用程序控制材质存储
+所有OpenGL对象使用一致的框架
+更简洁高效的同步机制
+应用程序控制缓冲区翻转
+使用任意颜色缓冲当作材质
纯GL2.0内核:
平滑过渡:
=》OpenGL1.3 (2.0包含1.3全部功能,不需修改)
=》OpenGL2.0 (应用程序可逐步使用2.0功能)
=》Pure OpenGL 2.0 (慢慢逐渐转移到Pure OpenGL)
=》今后的流线型API
重要新概念:
- Vertex Processor (顶点操作)
- Fragment Processor (象素操作)
- Pixel Pack Processor (象素紧缩操作)
- Pixel Unpack Processor (象素反紧缩操作)
影像化(Shading)语言:
+与1.3紧密集成
-现有状态机被可编程单元大大增大
+允许逐渐替代1.3固定流程的功能
-自动追踪已有状态
+基于C语言,提供全面的矢量和矩阵类型
-集成了一些RenderMan(一个有名的高质量渲染器)的特性
+虚化流程资源
-大部分情况下程序员不需操心资源管理
+顶点影像化和象素影像化使用相同的语言
-内置的函数和数据标识
顶点,象素操作(VertexProcessor,FragmentProcessor)能力:
大体类似DX8,DX9的VertexShader,PixelShader,可参见MSDN,在此不赘述。
紧缩,反紧缩操作(Pack/Unpack Processor)能力:
+随意的内存图数据格式
+通过可编程性获得自由性
+消除对下列Extension的需要
- EXT_cmyka
- SGIX_ycrcb
- EXT_422_pixels
- OML_subsample
- OML_resample
- NV_packed_depth_stencil
- 以及以上Extension的变体
辅助数据缓冲区(AuxDataBuffer 新增,非原来的AuxBuffer):
+简单泛化的概念,增强可编程性
+储存浮点数据
+具有帧缓冲的特性
+应用举例
-多次积累输出(运动模糊等)
-中间结果
-多光谱处理
-Sweeney style color/normal buffer (Sorry,此句我不懂)
-可渲染浮点图象再读回主机以实现后端渲染加速(用于网络渲染?)
影化器(Shader)管理:
+运行于OpenGL处理机的程序叫做“影化器”(Shader)
+影化器定义为一个字符串数组
+影化器用如下方法编译
- shaderID = CreateShaderObject(policy, priority, target, numStrings, strings);
- success = CompileShader(shaderID)
- (仍在寻找将上面两条合一的方案)
+编译错误如下方法取得
- errlog = CompilerErrorLog()
+指定当前影化器
- BindObject(shaderID)
+删除
-DeleteObject(shaderID)
+检察顶点影化器和象素影化器的兼容性
-ValidShader = CheckShaderBinding()
影化语言结构:
+修饰符
-const
- attribute (给顶点影化器的顶点数据)
-uniform (API提供的常量)
-varying (插值量,顶点影化输出,象素影化输入)
-uniform 和 varying 数组
+类型
-float
- vec2,vec3,vec4(浮点矢量)
-mat2, mat3, mat4(浮点矩阵)
-int(16位整型,用于循环和数组下标)
+表达式
-常量
-变量
-数量、矢量、矩阵操作
-+,-,*,/
-内置函数
-用户函数
-对矢量和矩阵的元素访问
-对矩阵的行或列访问
+流控制
-if, if else
- for
- while
- do...while
- break, continue
+用户函数
-使用引用参数
-可修改参数用output关键字修饰
-支持函数重载
-可能需要定义返回值以消除歧义
-其他类似C语言
+内定函数可用于数量或矢量
-sin, cos, tan, asin, 等
- pow, log2, exp2, sqrt, inversesqrt
- abs, sign, floor, ceil, fract, mod, min, max, clamp
- mix, step, smoothstep
- length, distance, normalize, dot, cross
- element (仅用于顶点影化)
- texture, lod, dPdx, dPdy, fwidth, kill, noise (仅用于象素段影化)
——待续
——向为OpenGL辛勤工作的大师们致敬