微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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和坑,相信不久修正的正式版本很快就会发布。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐