Deferred Shading in Flash with Stage3D

前不久得到了Flash Player 11.6的beta版本,里边增加了不少新的特性,比如对MRT的支持就很不错。有了MRT最直接的好处就可以在Stage3D上实现很流行的Deferred Shading。前不久做了些尝试,最终还是实现了,效果还不错。

设置MRT的设备相关函数为:

Context3D.setRenderToTexture(texture:TextureBase,enableDepthAndStencil:Boolean=false,antiAlias:int=0,surfaceSelector:int=0,colorOutputIndex:int=0):void

不同就在于最后一个参数colorOutputIndex,其就是用来设置render texture 在MRT中对应的颜色输出通道(这里可用的通道数量与d3d或ogl中得到的相同,也即硬件的支持数量)。

在具有MRT支持的同时还提供了对浮点纹理的支持,要不也无法使用MRT得到相应的G-Buffer。创建Float格式的纹理只需要使用

Context3DTextureFormat.RGBA_FLOAT

来作为纹理的格式描述即可(或者RGBA_HALF_FLOAT),在两个浮点纹理中具体G-Buffer的存储与压缩就可以根据具体情况适宜操作即可。

最后实现的效果大体如下:


这里有一些使用MRT相关的注意细节:

  1. 需要使用AgalMiniAssembler.assemble2来组装shader;
  2. 需要Stage3D requestContext3D时使用BASELINE_EXTENDED属性
  3. 在使用setRenderToTexture设置相应的render target之后应及时调用setRenderToTexture(null,...,1)来关闭相应的MRT输出,并及时设置输出至backBuffer;
  4. 对于RGBA_Float格式的贴图只能在shader中进行访问,否则认用传统管线使用时仍然会被处理为bitmap格式的纹理,导致渲染不正确;
  5. beta版本中还不能对相应的rendertarget设置相应关联的depthStencil Buffer;
  6. 对于在Stage3D中传入设置的纹理,必须在Agal shader中有读取访问,否则会导致最终的渲染结果(后续shader)不正确;
  7. 在渲染完成后应使用setTextureAt(index,null)来进行纹理通道的重置;
不过,目前的beta版本中依然存在不少的bug和坑,相信不久修正的正式版本很快就会发布。

相关文章

  译序:JWMediaPlayer是开源的网页使用的Flash播放器。本...
    Flash编程原理都是只能将1写为0,而不能将0写成1.所...
 上传setenvgatewayip192.168.1.1;setenvserverip192.168.1...
Error:FlashDownloadFailed-"Cortex-M3"出现一般有...
jPlayer是一个用于控制和播放mp3文件的jQuery插件。它在后台...
#ifndef__FONTUPD_H__#define__FONTUPD_H__#include"sy...