加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Deferred Shading in Flash with Stage3D

发布时间:2020-12-15 18:15:11 所属栏目:百科 来源:网络整理
导读:前不久得到了Flash Player 11.6的beta版本,里边增加了不少新的特性,比如对MRT的支持就很不错。有了MRT最直接的好处就可以在Stage3D上实现很流行的Deferred Shading。前不久做了些尝试,最终还是实现了,效果还不错。 设置MRT的设备相关函数为: Context3D.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读