《ImageEffects(屏幕特效)官方文档翻译》——编写屏幕特效【Writing Image Effects】

译注:鉴于翻译的混乱情况,将Texture译为纹理(实际上也应该如此),因为纹理和贴图还是有一些区别的。

Image Effects是Unity3D中一种进行图像后期渲染的方式。
添加任何具有OnRenderImage函数的脚本至摄像机上,都可以视为施加了一次图像后处理特效。

OnRenderImage函数
此函数接具有两个形参,Source Image是RenderTexture;destination是处理执行的结果,也是一份RenderTexture。通常情况下使用Shader来为后期处理过程取得source image RenderTexture,并对其进行一些计算,最后将计算的结果传递到预定的目标(使用Graphics.Blit)。图像处理的结果将会完全取代目标纹理的原像素信息。

当有多个后处理特效时,他们将会按照在Inspector(详细信息窗口/检视器)中的顺序执行,越上方的效果越被优先执行。上一个特效的处理结果将会作为Source Image传递给下一个特效。同时Unity3D会自动为这些临时的处理结果生成对应数量的临时RenderTexture(Temporary Render Textures)。

  • 提醒:
    • 目标RenderTexure可能为空,代表着渲染至屏幕(即BackBuffer)。通常发生在最后一次后处理时。
    • 当本函数执行完毕后,应该要保证存在有效的目标RenderTexture。换句话说,后处理效果执行完成后,要执行Graphics.Blit或手动渲染至目标纹理。
    • 通常应该关闭深度测试,禁止写入深度缓冲,否则在执行Graphics.Blit结果可能不正确。大多数的屏幕特效都使用了Cull Off ZWrite Off ZTest Always states。
    • 如果想要使用场景的模版缓冲或深度缓冲,则应该使用原场景的深度缓冲应用到你的ImageEffects中来。使用Graphics.SetRenderTarget来使现这个目的。

在不透明图像特效之后执行
默认情况下,所有的图像特效都是在整个场景被渲染完成后才执行。但是在有的情况下,在所有不透明物体都渲染完成后(天空盒和透明物体已渲染)再执行后处理特效不一定会得到想要的效果。经常遇到这种现象的是一些基于深度信息的特效,比如Depth of Field(景深效果)

通过在OnRenderImage函数前添加ImageEffectOpaque 特性标签可以改变这一现象。

不同平台上的纹理坐标
图像后处理特效在不同的屏幕相关的纹理上进行采样时,需要注意platform differences不同平台上的纹理坐标也是有可能不同的。

举个常见的例子来说,则是在不同的抗据齿设置时,来源纹理和相机深度纹理depth texture 有可能需要使用不同的垂直坐标。详情参见rendering platform differences。
译注:有遇到过在开启Global Fog以及对抗锯齿进行一些特定的设置后,会出现屏幕上下翻转的情况。就是文档中描述的这种现象。

使用标准资源包内的ImageEffects代码
特效包中包含了一些基础代码,都在UnityStandardAssets.ImageEffects命名空间中。

相关主题
Depth Textures通常被用在图像后期处理中,用来取得屏幕上每个像素点到最近的不透明表面的距离。
HDR渲染中,需要标准ImageEffectTransformsToLDR特性。
Graphics Command Buffers可以起到相似的效果,或者用于连接后处理过程。
RenderTexture.GetTemporary通常用于取得一次特效处理内的临时渲染纹理。
Writing Shader Programs.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值