1.1 前言
在系列第一篇中,咱们学习了用于图像含糊的相干算法,在探索这些算法效率高下的同时,深刻了解了这些算法的核心思想,这些思维将会被利用于许多后处理成果中。接下来, 咱们将学习一些常见的屏幕后处理成果的实现形式 。
1.2 基础知识
Bloom(Glow)特效是游戏中利用最广泛的一种屏幕后处理特效。体现为高光物体带有泛光成果,使画面的光影体现更加优良。Bloom 通常会搭配 HDR 和 ToneMapping 来失去更好的成果。
首先咱们须要简略理解一下什么是 HDR 和 ToneMapping。电子设备能够显示的亮度范畴无限,对于 RGB 三个通道,每个通道 8bit,由此以来能够显示(2^8)^3=16777216 种颜色,这个范畴被称为低动静范畴(Low-Dynamic Range)。这个范畴是一个教训亮度范畴,在这个范畴内不会对人眼产生挫伤,而超出这个范畴的色彩空间被称为高动静范畴(High-Dynamic Range)。现实生活中的亮度是没有范畴限度的,想要表白更多的亮度,RGB 每个通道须要裁减到 12 位乃至更多。运算实现后,在进行输入时须要通过 ToneMapping 将 HDR 空间中的色彩映射到 LDR 空间中,再在显示器上进行显示。
现实生活中,Bloom 产生的起因是人眼晶状体的散射,例如在强光照耀的时候,会有看不清的状况产生。于是应用 Bloom 来体现高光溢出的成果从而模仿这种景象。
对于 HDR、LDR、ToneMapping 的更多知识点能够学习《漫谈 HDR 和色调治理》。
通用的 Bloom 特效的制作形式是将图像高亮的局部通过卷积进行含糊之后再叠加到原图像上。在《屏幕后处理成果系列之图像含糊算法篇》课程中,咱们介绍了各种图像含糊的算法,抉择应用效率最高的 Dual Blur 的形式进行含糊解决。
1.3 Unity 实现
首先设定阈值,采样图片,对于图片中超过阈值的像素被断定为高亮局部。高亮局部,保留色彩,其余部分归 0,存储在一张 RT 中。
BloomMaterial.SetFloat("_Threhold", threshold);
BloomMaterial.SetFloat("_Intensity", intensity);
RenderTexture HighLighrRT=RenderTexture.GetTemporary(src.descriptor);
Graphics.Blit(src, HighLighrRT, BloomMaterial, 0);
Boom.shader:Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
fixed4 frag(v2f_img input) : SV_Target
{float4 color = tex2D(_MainTex, input.uv);
return max(color - _Threhold, 0) * _Intensity;
}
ENDCG
}
接着,将失去的高亮局部进行含糊解决后叠加在原图上:
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
sampler2D _CompositeTex;
float4 _CompositeColor;
fixed4 frag(v2f_img input) : SV_Target
{float4 mainColor = tex2D(_MainTex,input.uv);
float4 compositeColor = tex2D(_CompositeTex, input.uv);
return saturate(mainColor + compositeColor);
}
ENDCG
}
失去成果如图:
原图如下:
相似地,模拟实现“光剑”成果:
1.4 小结
Bloom 成果能够说是游戏中应用最为广泛的屏幕后处理特效了,实现也较为简单。从此咱们能够学习到通过含糊解决产生能够使色彩天然平滑地晕开,通过色彩叠加能够使亮度晋升。
影响 Bloom 成果性能最大的因素是进行含糊解决的开销。参考《屏幕后处理成果系列之图像含糊算法篇》的内容,倡议抉择 Dual Blur 算法进行解决。
残缺课程可戳此查看《屏幕后处理成果系列之常见后处理成果篇》。