《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.
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.
相关文章推荐
- 《ImageEffects(屏幕特效)官方文档翻译》——屏幕特效介绍【Image Effect Reference】
- Android Web App官方文档翻译第二章:屏幕适配
- django 1.8 官方文档翻译: 3-1-2 编写视图
- django 1.8 官方文档翻译: 1-3-1 高级教程:如何编写可重用的应用
- Android官方文档翻译:支持不同的屏幕
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)
- Dojo1.11官方教程文档翻译(3.4)Dojo特效
- Android Web App官方文档翻译第二章:屏幕适配
- Unity2017.1官方UGUI文档翻译——Image
- SDWebImage 官方文档 翻译(v3.7.5 中文 简介,非API文档 )
- Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
- Android Web App官方文档翻译第二章:屏幕适配
- django 1.8 官方文档翻译: 1-2-5 编写你的第一个Django应用,第5部分
- django 1.8 官方文档翻译: 1-2-1 编写你的第一个Django应用,第1部分
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第三部分(Page 8)
- Android Web App官方文档翻译第二章:屏幕适配
- django 1.8 官方文档翻译: 2-4-4 编写迁移
- django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分
- django 1.8 官方文档翻译: 1-2-4 编写你的第一个Django应用,第4部分
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第四部分(Page 9)