深入挖掘Molehill API的一些特征

Molehill API为Flash平台引入了高质量的3D渲染能力,它利用DirectX9、OpenGL1.3等技术实现了高性能的3D图形加速,并且提供了灵活的编程接口,允许开发者直接调用底层3D加速。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几个月前,在洛杉矶举办的Max2010大会上我们介绍了有关Molehill API在Flash桌面平台和移动平台应用 上的简单情况.具体情况可参考这里:Molehill” page.本文我想从AS开发 者的角度详细阐述和Molehill有关的技术特征.

让我们开始吧 :-)




什么是Molehill?

“Molehill”是一个API的项目名,这一系列API的作用是暴露给Flash平台上的ActionScript3.0语言一些可编程化接口,从而能让as3 直 接调用底层3D加速.它能给Flash平台带来高质量的3D渲染.Molehill依靠Windows上的DirectX9,MacOS和Linux上的 OpenGL1.3,在手机平台比如Android,Molehill利用OpenGL ES2来渲染.从技术角度来说,Molehill是真正基于着色器的3D GPU编程(关于着色器的更多情况:http://goo.gl/wqKHs ), 并给3D Flash开发者带来了他们想要的一些新特征,比如基于顶点着色器和片段着色器(在Direct3D中称为像素着色器,在OpenGL中成为片段着色器) 的编程,不但支持像顶点纹理处理这样的事情更包括原生深度缓冲,模板颜色缓冲,立方纹理等等(专业术语太多,附上原文:to enable things like vertex skinning on the GPU for bones animation but also native z-buffering, stencil color buffer, cube textures and more.)

从性能角度考虑,对于FlashPlayer10.1版本,渲染数千个没有Z轴深度缓冲的三角化物体接近30Hz,通过新的3D ApI,开发者在全屏高清环境下渲染数万个有Z轴深度缓冲的三角化物体频率能达到60Hz! Molehill使为网络传输和绝大多数设备带来高质量3D体验成为可能.可以通过这个
视频 来了解Molehill的具体表现.

它工作的方式

在fp10版本中现有的2.5D API版本并没有被贬低,Molehill API将会提供一系列完全通过GPU加速的高级3D渲染.根据项目的具体情况你可以选择使用哪个API版本.

最近我们介绍的fp10.2中的“Stage Video”测试版已经可以通过
Adobe labs下载 了.

StageVideo使用同样的
设计 , 利用GPU加速渲染高清影像.通过该渲染引擎,FP不是通过将视频帧或者3D缓冲加入显示列表靠CPU计算而是加入到舞台旁边的纹理处理器并通过GPU渲 染(原文:but inside a texture sitting behind the stage painted through the GPU).这个允许FP直接调用显卡资源处理屏幕上的显示内容.处理是单向的,显卡将处理好的内容直接交给CPU,CPU将数据 加入到显示列表最后依靠FP来显示(No more read back is required, to retrieve the frames from the GPU to push them on screen through the display list on the CPU)

由于3D内容处在FP的舞台旁边并且不属于显示列表的内容,Context3D和Stage3D并不是显示对象,所以记住你不能像使用DisplayObject类那样使用它们,rotation,遮罩,滤镜以及其他很多
效果 都无法应用.

以下这样图演示了我们的想法




当然,正如你看到的,2D内容可以包围3D的内容,但是反过来却不行.然而如果需要的话我们提供了一个API允许你将3D内容以
Bitmap data方式呈现.作为一个开发者,我们的绝大多数工作是和Context3D以及Stage3D打交道,当你需要一个3D内容时创建一个Context3D对象.也许你现在会想,如果GPU驱动不兼容怎么办,难道我将静默的得到一个黑屏?

FP依然会返回给你一个Context3D,只是此时的内容是软件内部模拟产生的.所以你依然可以使用全部的Molehill API只是此时渲染是通过CPU来计算罢了.为了验证我们我们所说的,我们依靠TransGaming公司的一个名为"SwiftShader"的显卡渲 染增强软件(CPU rasterizer),好消息是即使使用软件模拟SwiftShader的渲染速度依然快于FP10倍,所以你可以运行软模拟来预计一些严重的性能差异 提升.


"Molehill"API的好处在于你不需要了解它的内部是怎么工作的.我现在运行的是DirectX,OpenGL还是SwiftShader?我是 否该使用不同的API当运行的平台不一样的时候?不,所有的都会转换成同一种编程模式同一个API接口,FP将会在内部自己处理这些不同.


需要谨记的是,  Molehill API只使用programmable pipeline而不使用fixed function pipeline(关于两者的更多情况
http://goo.gl/HHPNN ), 这意味着你需要使用三角顶点和像素来表现所有需要显示的对象.于此,你将能传给显卡你的着色器当作低级别的AGAL("Adobe Graphics Assembly Language")形式的二进制比特流(原文;For this, you will be able to upload on the graphics card your shaders as pure low-level AGAL (“Adobe Graphics Assembly Language”) bytecode as a ByteArray),身为一个开发者,你有两种工作方式,第一种使用底层方法编写你的渲染器,这需要对渲染器的工作方式有清晰的了解或者使用高级语言比 如Pixel Bender 3D里面集成的脚本语言那样帮助我们转换成AGAL字节码.

为了表现你的三角图元,你需要了解VertexBuffer3D和IndexBuffer3D对象,通过传入三角顶点坐标以及索引来构造,一旦你的顶点着 色器和像素着色器准备完毕,你需要通过Program3D对象来将它们传输给显卡处理.基本上说顶点着色器负责处理你绘制的三角形的顶点坐标而像素着色器 负责逐像素计算颜色以及凹凸纹理映射.


下面这幅图阐述了两种着色器间的不同




就像之前说的一样,Molehill不是用fixed function pipeline,因此开发者可以自由的创建他们自定义的着色器并且完全控制渲染流水线.那么让我们来研究下Molehill下的顶点着色器和像素着色器吧


深入了解顶点和像素着色器

为了阐明这个观点.先来展示一个使用低级别的渲染装配编写的三角形并用到了像素级Molehill.让我们准备好吧.假设我们将要编写一个用低级别着色器渲染出来金属材质,如果你对此感到讨厌,不要担心可以使用类似于PixelBender3D这种高级别的语言来编写.

为了创建一个能给显卡处理的着色单元,我们需要使用一个顶点着色器(Context3DProgramType.VERTEX)来至少输出夹式空间 (clip-space:视锥体裁剪之后的空间)的位置坐标.为了实现这个,我们需要用va0(每个三角顶点的位置属性)乘以vc0(常量 0),我们的投影矩阵存储在这个索引里并且通过op(output position的缩写)关键字来输出结果:


// 用汇编创建一个顶点
程序
var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();

vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,

"m44 op, va0, vc0 /n" // 4x4 的从0(顶点位置)变换到输出夹式空间的矩阵
);你可能会疑惑这个m44是什么,他从哪里来?

这其实是一个4x4的矩阵转换,它延伸至我们之前定义的矩阵投影.我们可以编写一个着色器利用如下计算方法来手动计算每个点属性乘积,但是m44指令(在同一行里执行一个4x4的矩阵所有属性变换)远远短于前面的.


// create a vertex program - from assembly

var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();

vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,

"dp4 op.x, va0, vc0 /n" + // 4x4 matrix transform from stream 0 (vertex position) to output clipspace
"dp4 op.y, va0, vc1 /n" +
"dp4 op.z, va0, vc2 /n" +
"dp4 op.w, va0, vc3 /n" +
);
记住vc0(顶点常量 0)实际上只是我们存储在序列里的投影矩阵,作为早些时候通过setProgramsConstantMatrix方法传递给Context3D对象的常量:


context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, modelMatrix, true );

正如我们的矩阵不变,va0(顶点属性0)的位置,需要加以界定,而且我们也通过Context3D对象的setVertexBufferAt 方法来实现的。


context3D.setVertexBufferAt (0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3 );

在我们的例子中,顶点着色器将顶点颜色(va1)通过v0和MOV指令传给像素着色器以便实际用来绘制我们的三角形图像.要实现这一点我们可以写如下内容:


// create a vertex program - from assembly

var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();

vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,

"m44 op, va0, vc0 /n" +

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值