Deferred Shading in Flash with Stage3D

4 篇文章 0 订阅
2 篇文章 0 订阅

前不久得到了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和坑,相信不久修正的正式版本很快就会发布。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值