|
AGAL介绍 Flash 11的Stage3D类为Flash引入了一套全新的字节码:AGAL(Adobe Graphics Assembly Language)。今天我第一次开始写一系列的文章来讨论什么是AGAL,怎样生产这些字节码,以及这些着色器是怎么工作的。请继续阅读这一系列文章中的第一张来学习AGAL的基础。
首先我们要来理解一些术语。AGAL表示两层意思: 第一个,Stage3D着色器字节码格式的名称,就像我们常常谈论的游AS3,C++(炼金术)或者Haxe编译而来的AVM2字节码。 第二个意思就是编译成AGAL字节码的汇编语言。我将用“AGAL字节码”和“AGAL汇编”来对这两个意思加以区别。 AGAL汇编不是产生AGAL字节码的唯一途径,就现在而言,有以下几种方式可以生产它(使用16进制编辑器除外): 语言 | 语言类型 | 编译器/汇编器 | API | AGAL | 汇编 | Adobe’s AGALMiniAssembler AS3 class | None (directly use Stage3D) | Pixel Bender 3D | 高级语言 | Adobe’s beta compiler | Pixel Bender 3D API | HxSL | 高级语言 | HaXe | HaXe Language |
在这些方式之中,AGAL汇编提供了最低级的代码,让你能够最大幅度地提升性能和使用最多的特性。它也不需要任何庞大的API库或者切换到Haxe语言。不过缺点是你不得不使用汇编语言来编写你所有的着色器,因此会键入许多非常难以阅读的代码。不过,着色器总是出现在和性能相关的代码区域,所以他不会出现在你不想优化的地方。相对于你的整个应用程序或者游戏来说,你不会写很多的着色器代码,所以你是不是能够很快键入成千上万行的着色器代码并不重要。因此,我将只介绍AGAL,他也是我现在选择的着色器语言。
在你开始写代码之前理解一些基本的Stage3D着色器工作原理是非常重要的。首先,它们被分为两部分:第一部分被称作“顶点着色器”(Vertex Shader),他的作用是定义每个顶点的位置。第二部分被称作“片段着色器”(Fragment Shader),他的作用是为每个片段(粗略的一个像素)定义颜色。这两个部分组成了“着色器程序”(Shader Program)通过Stage3D API被上传和使用。 - // Create a shader program. It is initially unusable.
- var shaderProgram:Program3D = myContext3D.createProgram();
- // Upload vertex shader and fragment shader AGAL bytecode. It is now usable.
- shaderProgram.upload(vertexShaderAGAL, fragmentShaderAGAL);
- // Use the shader program for subsequent draw operations
- myContext3D.setProgram(shaderProgram);
- // Draw some triangles with the shader program
- myContext3D.drawTriangles(someTriangleIndexBuffer);
复制代码 为了设置顶点位置和片段颜色,我们需要能够给着色器程序传递数据。这些数据包括摄像机矩阵的变换,材质,颜色,向量等等。下图描述了数据是怎样从你的AS3程序传递到顶点着色器,到片段着色器最终到你要绘制的目标(屏幕或者材质)上的。
一些数据类型需要解释: 数据类型 | 绑定目标 | 例子 | Vertex Constants | Vertex Shader | Transformation matrices, bones (for skeletal animation) | Vertex Attributes | Vertices | Positions, normals, colors | Varying Values | Vertices | Texture coordinates, colors | Textures | Fragment Shaders | Art-driven colors, normal maps | Fragment Constants | Fragment Shaders | Fog colors, object-global alpha values |
最棘手的是这些类型是“变量”,他们的值是顶点着色器根据每个顶点算出来的。当三角形被绘制完成的时候,这些变化着的值才被插入。例如如果你的顶点着色器在一个顶点上输出红色,一个顶点上输出绿色,第三个输出蓝色,那么你的片段着色器会输出变化的值,你会得到这样一个三角形:
在以后的文章中,你会看到这一点在很多3D绘制操作上非常高效。例如:一个简单的带有材质的三角形能够查找这个三角形上的每个片段的材质坐标,但是这个查找操作极度浪费性能。而在每个顶点上面查询材质坐标,然后简单地使用一个可变量插入要好得多。
这个系列的第一篇文章就到此为止,等到下次我们会深入AGAL汇编语言,并编写一些着色器。
|