Natalya Tatarchuk
3D Application Research Group
ATI Research
作者:董宝成
Email:dongxinzhiemail@163.com
介绍
目前3D图形应用程序开发人员面临的挑战主要集中于创建和使用可编程图形shaders。这些可编程的图形shaders是将来图形编程的核心竞争力。
有能力创建和使用这些可编程shaders的开发人员将能够享受所有硬件所提供的高级特性和创建颠覆传统实时图形艺术的应用程序。为可帮助开发者充分释放这些竞争力潜在优势,ATI开发了一组工具— RenderMonkey 工具集。
尽管写汇编或高级shader语言代码是开发过程的核心,但shaders远不止这么简单。压缩一个基于shader的效果是一个复杂的任务因为包括捕获所有包括这些渲染特效系统的状态。这就导致一个普遍存在于shader开发者之间的问题 — 交换和共性数据不是一件简单的事。另一个问题是在开发shader程序的工程中它必须与艺术家紧密的交流。由于没有适合艺术家使用的工具,就造成了开发过程中合作的困难。现在需要的是一个开发环境,他不仅仅适合程序员而且艺术家和游戏设计者也能够一起合作,从而创造出预想的效果。RenderMonkey就是被设计用来解决这些问题的。用这个工具,我们提供了一个创建shaders的强大的程序员开发环境,它能被作为一个标准的传输机制允许开发组之间共享基于shader的特效。我们也提供了一个灵活的,可扩展的框架他能够非常容易的将自定义的组件集成而且还为以后的工具开发提供了一个基本的固件集。RenderMonkey 能很容易定制和集成到任何开发者的工作流中。RenderMonkey集成开发环境的设计使得将当前的和以后的API结合在一起变得非常容易。这篇文章是关于1.0版本的,他能够支持DirectX9.0 shader 特效(用汇编和HLSL都行),也支持基于GL2编写的基于OpenGL的特效。
集成开发环境预览
RenderMonkey应用程序接口对那些曾经用过像Microsoft Visual Studio之类的集成开发环境的开发者而言将是非常直观的。图1是一个接口渲染一个云特效时的快照。

图1 — 主要应用程序界面
这个主要接口有以下几个组件组成:
l 一个编辑特效的工作区视图
l 一个用于显示编译结果和来自应用程序的文本信息的输出窗口
l 一个用于预览被编辑特效的预览窗口
l 另外的编辑模块还有用于编辑代码的编辑器和用于shader参数的GUI编辑器。Shader参数能被指定为“艺术家可编辑”标记然后它就能够用艺术家编辑器模块进行编辑。
创建一个基本的照明特效
在这节,我们将创建一个简单的照明特效在RenderMonkey 的预览窗口渲染一个明亮的材质。尽管这个简单计算光照强度的方法来自用于初学者图形学书籍,但是它作为学习用RenderMonkey 集成开发环境快速开发shader的指南非常好。它还充分展示了用微软的HLSL开发shader程序的的优雅,我们能用熟悉的光照公式而且用很少的几行代码就能够实现很好的视觉效果。
我们将用Phong光照模型来实现这个特效。如果我们仔细研究任何一本图形学的书籍都能找到计算该光照模型的公式,该公式如下:
I = Iambient + Idiffuse + Ispecular (1)
每个光照组件贡献的计算如下:
Iambient = Ka*Ia (2)
Idifuse = Kd*Id * (N dot L) (3)
Ispecular = Ks*Is * (V dot R)n (4)
Ka ,Kd ,Ks 分别环境,漫射和镜面光照的系数。根据我们表面的反射系数,这些参数被指定为范围在0到1的常量值。如果我们想要一个高反射率的表面,我们要设置Kd和Ks的值接近1。这将产生一个光亮的表面,在光直接照射的地方有一个高强度的高光 。为了模拟一个高吸光率的表面,我们设置反射率的值接近0。
Id是漫反射光照强度,Is是镜面反射强度,Ia是环境光强度。N,V,R分别为法向量,视向量和反射向量。 n是镜面反射系数,调整视向量和反射向量的之间的角度值。光泽的表面有一个狭窄的光照范围(这两个向量之间的夹角很小),一个以南的表面有宽的反射范围。因此一个非常光泽模型有一个大的n值(100左右),一个黯淡的表面有一个大概等于0.5的值。
我们在像素shader中用公式(2)——(4)来计算该光照模型的每个像素的最终颜色。但首先我们要建立应用程序和特效工作区。
运行时数据库预览
在RenderMonkey 中的每一组视觉特效都被压缩到一个单独的XML工作区中。除了纹理和材质存储在一个单独的文件中之外,所有这些信息对创建特效都非常关键。它使用户可读的,而且每一个游戏开发人员都能够创建自己的转换工具将RenderMonkey 的文件格式转换成他们各自的游戏引擎的脚本格式。我们有充分的理由选择用XML来存储特效工作区。最重要的,XML是工业标准且不失易用性(RenderMonkey 用微软的XML剖析器还有其他一些可选的理由)。他表示数据很容易而且是用户可扩展的。最酷的就是,任何人都能用IE直接打开RenderMonkey的XML文件进行阅读 — 它只是另一种ASCII文件格式。
要创建一个基于shader的特效,我们首先要启动一个应用程序,它将自动为你创建一个空的工组区。所有和特效有关的数据都会用RenderMonkey的运行时数据格式存储在该工作区中。每个特效工作区由下列一些元素组成:
l 变量节点
l 流映射
l 模型
l 纹理变量
l 特效组
一个特效组把一系列相关的特效组合在一起。比如,你可能想把所有用一个噪点函数渲染的混乱特效组合在一起,像云,火或等离子。
每一个特效组由一个或多个特效节点组成。每一个特效节点用来描述一个单独的视觉特效。你可能想用一个单独的过程特效,或用几个绘制掉用来产生你想要的结果。每个绘制调用可能有下列数据组成:
l 一个渲染状态块(可选)
l 一个顶点shader(必须)
l 一个像素shader(必须)
l 一个几何模型参考(必须)
l 一个流映射参考(必须)
l 一个或多个有有效纹理参考的纹理对象(可选)
l 变量节点(可选)
所有在RenderMonkey特效工作区涉及到的单独项目都被指定为节点。
