您的位置:首页 > Web前端

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

2016-11-01 11:27 393 查看
译注:鉴于翻译的混乱情况,将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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d 图形 文档