近段时间接触使用了Unity的后处理插件Post-Processing。
该插件十分强大,能增强画面真实感,产生发光效果,进行调色等。使用也很简单,调节一下参数即可。
本文主要参考来源为官方文档 (若有翻译不到位处,欢迎指出),部分参考来自他人文章,链接一并放出。
Post-Processing 官方文档:https://docs.unity.cn/Packages/com.unity.postprocessing@3.1/manual/index.html
Tonemapping 讲解 (简书):https://www.jianshu.com/p/2ba6bb4e72da
后处理 (Post-Processing) 是全屏图像处理效果的通用术语,它发生在摄像机绘制场景之后,但场景在屏幕上呈现之前。后期处理可以大大改善您的产品的视觉效果,只需很少的设置时间。您可以使用后期处理效果来模拟物理相机和胶片的属性。
适用Unity版本:2018.1及以上
Post-Processing是Unity的后处理插件,最早在2017年3月与Github上发布1.0版本,到2.0版本进入Unity的 Asset Store。
Post-Processing的出现让Unity拉近了与Unreal Engine之间的画面差距,目前它已成为Unity渲染环节的重要组成部分,在URP管线中也是直接内置集成了该插件。

第一步,导入插件。点击Window > Package Manager,输入Post Processing,安装导入。我这里使用的是3.1.1版本,目前最新版是3.2.0版本。

第二步,设置渲染层。在场景Camera上Add Component > Rendering > Post-process Layer,只有添加该组件后的相机才会进行后处理效果。
因为可能我们场景会有许多相机,不同相机我们可能希望使用不同的后处理效果,所以我们需要设置相机所在的层。可以新建一个Layer,名字随意,我这里新建一个Post Procesing层。将相机设为此层,并将组件里的Layer也设为此层。

第三步,添加效果器。此时可以设置后处理效果了,可以直接继续在Camera下Add Component > Rendering > Post-process Volume。
勾选Is Global,此时效果会全局生效 (即无论相机在何处都会有效果)。然后点击Profile右侧的New可以新建一个预设,之后就可以点Add effect添加各种效果了。

PS:如果我们想只在场景的特定区域应用效果,就不在相机上添加Post-process Volume组件。在场景中创建一个空物体,设置该物体Layer与相机Layer相同,在该物体上添加Post-process Volume组件,Is Global不勾选。再添加Box Collider组件,调整Collider大小。此时相机进入Collider范围内就会有效果,出范围外效果就消失。

根据需要的效果在Post-process Volume中添加对应的模块,并调节参数。有的模块参数比较多,边调边看效果就好,不清楚再看表格的参数说明。共11种效果,1、2为环境光效果,3、4为图像后处理,5-11为相机镜头效果。这里我以我自己搭建的简易场景进行测试。


– 该效果会使光线无法照射到的区域变暗,如折痕、洞、物体与物体间的空隙部分。
包含两种模式,其中Scalable Ambient Obscurance (SAO)效果好但性能开销大,Multi-scale Volumetric Occlusion (MVO)速度快 (适用于移动端)。
| SAO参数 | 说明 |
|---|---|
| Intensity | 调整Ambient Occlusion产生的黑暗程度。 |
| Radius | 设置采样点的半径,控制暗区的范围。 |
| Quality | 定义样本点的数量,该参数影响最终效果与游戏性能。 |
| Color | 设置环境遮挡的色调颜色。 |
| Ambient Only | 启用此复选框使Ambient Occlusion效果只影响环境照明。此选项仅在Deferred渲染路径和HDR渲染时可用。 |
| MVO参数 | 说明 |
|---|---|
| Intensity | 调整Ambient Occlusion产生的黑暗程度。 |
| Thickness Modifier | 修改遮挡的厚度。该参数能增加暗区,但会在物体周围引入暗晕。 |
| Color | 设置环境遮挡的色调颜色。 |
| Ambient Only | 启用此复选框使Ambient Occlusion效果只影响环境照明。此选项仅在Deferred渲染路径和HDR渲染时可用。 |
启用该效果后,看到墙角等物体交接处产生了黑影,真实感加强。

– 该效果会创建微妙的反射效果,用以模拟潮湿地板表面或水坑。
| 反射参数 | 说明 |
|---|---|
| Preset | 可以从下拉菜单中选择质量预设。使用Custom可以微调质量。 |
Maximum Iteration Count (Custom preset only) | 设置射线行进通道的最大步数。值越高,反射越多。 |
Thickness (Custom preset only) | 设置射线厚度的值。较低的值可以检测到更小的细节,但会比较消耗资源的。 |
Resolution (Custom preset only) | 选择内部缓冲区的大小。选择Downsample性能最好。Supersample较慢,但效果更好。 |
| Maximum March Distance | 设置在场景中绘制反射的最大距离。 |
| Distance Fade | 设置接近反射面的反射淡出距离的值。可以用于消去伪影。 |
| Vignette | 设置反射图像淡出反射物边缘的范围。 |
添加该效果时,出现黄色警告。根据提示,更改Camera组件的Rendering Path为Deferred即可。更改后,发现画面出现锯齿,可以看到Post-process Layer组件中Anti-aliasing的Mode为No Anti-aliasing,改为其他任意一个即可。

启用该效果后,看到反射率大于0的物体会出现周围物体的反射像,真实感加强。

– 该效果会动态调整图像的曝光以匹配其中间色调,用以模拟人眼实时调整亮度的变化。
| 曝光参数 | 说明 |
|---|---|
| Filtering | 设置直方图中找到稳定平均亮度的上下两个百分比。超出这个范围的值将被丢弃,并且不会对平均亮度有贡献。 |
| Minimum | 设置最小平均亮度,作为曝光值(EV)的参考。 |
| Maximum | 设置最大平均亮度,作为曝光值(EV)的参考。 |
| Exposure Compensation | 设置中灰色值来补偿场景的全局曝光。 |
| 适应参数 | 说明 |
|---|---|
| Type | 选择适配类型。Progressive会进行自动曝光。Fixed不会进行自动曝光。 |
| Speed Up | 设置从暗到亮的适应速度。 |
| Speed Down | 设置从亮到暗的适应速度。 |
一般夜晚环境可能感觉场景偏暗,又不可能打太多太亮的灯,可以考虑使用这个效果给画面整体提亮。

– 该效果可以改变图像的颜色亮度。
| 全局设置参数 | 说明 |
|---|---|
| Mode | 选择Color Grading效果模式。 |
| Lookup Texture | LDR: 选择一个自定义纹理(条带格式,如256x16)应用于颜色滤镜的其他效果之前。如果没有纹理,则无效果。 External: 一个自定义纹理(色彩空间为log编码). |
| Contribution | LDR: 设置纹理效果的比重。 |
| 色调映射参数 | 说明 |
|---|---|
| Mode | 仅在High Definition Range模式下可用。从下拉菜单中选择色调映射模式。None: 无色调映射。Neutral: 应用范围重映射与最小的影响色彩色调和饱和度。ACES: 应用接近电影色彩的外观 (参考ACES )。这种效果相比Neutral的色调和饱和度有更多的对比度。当启用该调色器时,所有的色彩操作都在ACES颜色空间中进行,能获得最佳的精度和结果。Custom: 一个全参数调色器。这是唯一一个有自设置的调色器。 |
| Toe Strength | 设置曲线的底部和中部之间的过渡值。值为0没有过渡,值为1为非常硬的过渡。 |
| Toe Length | 设置曲线底部的长度。值越大,我们图像的较暗的部分会更暗。 |
| Shoulder Strength | 设置曲线中部和顶部之间的过渡值。值为0没有没有,值为1为非常硬的过渡。 |
| Shoulder Length | 设置曲线顶部的长度。值越大,我们图像的较亮的部分会更亮。 |
| Shoulder Angle | 设置曲线顶部与中部过渡的角度值。 |
| Gamma | 曲线的 gamma 矫正 ,值为1 时不做矫正。 |
| 白平衡参数 | 说明 |
|---|---|
| Temperature | 设置白平衡色温。 |
| Tint | 设置白平衡补偿 (绿色或洋红色调)。 |
| 色调参数 | 说明 |
|---|---|
| Post-exposure | 仅支持**High Definition Range(HDR)**模式。设置EV单元中场景的整体曝光值。该效果会在HDR效果之后再处理,所以它不会影响前面渲染的结果。 |
| Color Filter | 选择渲染的色调。 |
| Hue Shift | 调整所有颜色的色调。 |
| Saturation | 调整所有颜色的强度。 |
| Brightness | 仅支持**Low Definition Range (LDR)**模式。调整图像的亮度。 |
| Contrast | 调整色调值的整体范围。 |
| 混合通道参数 | 说明 |
|---|---|
| Channel | 选择要修改的输出通道(红/绿/蓝)。 |
| Red | 调整红色通道在整体混合中的影响。 |
| Green | 调整绿色通道在整体混合中的影响。 |
| Blue | 调整蓝色通道在整体混合中的影响。 |
| 轨道球参数 | 说明 |
|---|---|
| Lift | 调整暗色调(或阴影)。 |
| Gamma | 调整中色调。 |
| Gain | 调整亮色调。 |
添加该效果时,出现黄色警告。根据提示,需要设置色彩空间。点击Edit > Project Settings > Player,找到Other Settings中Rendering的Color Space,将其改为Linear即可。

这个东西跟PR里面的lumetri挺像的,就是个调色盘,参数非常多,能调出各种不同的效果。

– 该效果会使图像中明亮的区域延伸出光条纹,用以模拟真实世界中相机镜头被光线淹没的效果。
| Bloom参数 | 说明 |
|---|---|
| Intensity | 设置Bloom过滤器的强度。 |
| Threshold | 设置亮度级别,过滤掉这个级别下的像素。这个值用γ空间表示。 |
| Soft Knee | 设置在阈值上下界(0 =硬阈值,1 =软阈值)之间的渐变阈值。 |
| Clamp | 设置限制像素的值来控制Bloom数量。这个值用γ空间表示。 |
| Diffusion | 设置遮蔽效果的范围(与屏幕分辨率无关)。 |
| Anamorphic Ratio | 设置比率以垂直(范围[-1,0])或水平(范围[0,1])缩放Bloom。模拟变形透镜的效果。 |
| Color | 选择Bloom滤镜的色调颜色。 |
| Fast Mode | 启用此复选框,通过降低Bloom效果质量来提高性能。 |
| Dirtiness参数 | 说明 |
|---|---|
| Texture | 选择一个肮脏纹理添加污点或灰尘镜头。 |
| Intensity | 设置镜头的肮脏程度。 |
这里我们让墙上的海报发光,制作电子屏幕的效果。首先,设置它们的shader设置为一个不受光照影响的shader,我这里设为Unlit/Texture。

发光效果只能加一点点,不能加多喽,让光有一点点晕开的感觉就好。参数拉太高会产生光污染,影响游戏体验,非常难受。

– 该效果会分离图像的红绿蓝通道,用以模拟现实世界中相机在光线折射产生的不同波长光分离的效果。
| Property | 说明 |
|---|---|
| Spectral Lut | 选择用于自定义散射颜色的纹理。当为空时,Unity将使用默认纹理。 |
| Intensity | 设置Chromatic Aberration效果的强度。 |
| Fast Mode | 使用一个更快的Chromatic Aberration效果的提高性能。 |

– 该效果会模糊图像的背景,用以模拟真实世界相机镜头的焦距特性,产生对焦效果。
| 景深参数 | 说明 |
|---|---|
| Focus Distance | 设置到焦点的距离。 |
| Aperture | 设置光圈的比例(称为f-stop或f-number)。数值越小,景深越浅。 |
| Focal Length | 设定镜头和胶卷之间的距离。数值越大,景深越浅。 |
| Max Blur Size | 从下拉菜单中选择散景滤镜的卷积内核大小。这个设置决定散景的最大半径。它也会影响性能。内核越大,需要GPU渲染时间越长。 |

– 该效果会将胶片噪声叠加到图像上,用以模拟相机胶片上的小颗粒产生的粗糙效果,营造电影效果。
| 纹理参数 | 说明 |
|---|---|
| Colored | 启用复选框使用彩色颗粒。 |
| Intensity | 设置Grain的强度。数值越高,可见颗粒越多。 |
| Size | 设置Grain的大小。数值越高,颗粒尺寸越大。 |
| Luminance Contribution | 通过设置该值来控制噪声响应曲线。这个值是基于场景亮度的。数值越低,暗区噪音越小。 |

– 该效果会使图像产生畸变 (枕形/桶形),用以模拟真实世界相机镜头的形状引起的失真。
| 畸变参数 | 说明 |
|---|---|
| Intensity | 设置总失真量的值。 |
| X Multiplier | X方向上失真强度。0为不失真。 |
| Y Multiplier | Y方向上失真强度。0为不失真。 |
| Center X | 设置失真中心点(X轴)。 |
| Center Y | 设置失真中心点(Y轴)。 |
| Scale | 设置全局屏幕缩放的值。 |

– 该效果会使图像边缘变暗,用以模拟真实世界中过厚或堆叠过多滤光片、副镜头或不合适镜头笼罩引起的效果。使用此效果能使人的注意力聚焦到图像中心。
包含两种模式,其中Classic模式是围绕中心的晕影,Msaked模式可以自定义晕影形状纹理。
| 经典模式参数 | 说明 |
|---|---|
| Color | 设置Vignette的颜色。 |
| Center | 设置Vignette中心点(屏幕中心为[0.5,0.5])。 |
| Intensity | 设置屏幕上渐晕的数量。 |
| Smoothness | 设置Vignette边框的平滑度。 |
| Roundness | 将值设置为Vignette的圆滑度。较低的值会使其接近方形。 |
| Rounded | 启用此复选框可以使Vignette完全变为圆形。禁用时,Vignette效果依赖于当前的宽高比。 |
| 遮罩模式参数 | 说明 |
|---|---|
| Color | 设置Vignette的颜色。使用alpha通道来增加透明度。 |
| Mask | 选择一个黑白蒙版来用作为Vignette。 |
| Intensity | 设置遮罩不透明度值。 |

– 该效果会使物体在运动方向产生模糊,用以模拟现实中相机光圈打开情况下移动或捕捉移动速度快于相机曝光时间的物体时产生的模糊效果。
| 模糊参数 | 说明 |
|---|---|
| Shutter Angle | 设置旋转快门的角度。数值越大,曝光时间越长,模糊效果越强。 |
| Sample Count | 设置采样点数量的值。这会影响质量和性能。 |
有时我们需要镜头效果根据时间产生变化,比如:人从昏迷醒来时视力的慢慢恢复,战斗时受伤死亡的屏幕闪动变化,高光时刻或危险警告等屏幕特效。那么这时就要使用代码控制插件中的参数来实现。
直接附上官方文档中的代码,可以简单了解下脚本的实时控制。
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class VignettePulse : MonoBehaviour
{
PostProcessVolume m_Volume;
Vignette m_Vignette;
void Start()
{
// Create an instance of a vignette
m_Vignette = ScriptableObject.CreateInstance<Vignette>();
m_Vignette.enabled.Override(true);
m_Vignette.intensity.Override(1f);
// Use the QuickVolume method to create a volume with a priority of 100, and assign the vignette to this volume
m_Volume = PostProcessManager.instance.QuickVolume(gameObject.layer, 100f, m_Vignette);
}
void Update()
{
// Change vignette intensity using a sinus curve
m_Vignette.intensity.value = Mathf.Sin(Time.realtimeSinceStartup);
}
void OnDestroy()
{
RuntimeUtilities.DestroyVolume(m_Volume, true, true);
}
}
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po