题外话:关于黑色和白色在计算机中的颜色占比
黑色RBG=(0,0,0)、白色RBG=(1,1,1)
在现实生活中黑色吸收所有光,即所有光都不反射,因为本身的其RGB的颜色组成都是0;
白色反射所有光,即所有光都反射,因为本身的其RGB的颜色组成都是1。

进入正题
原理:
辉光的实现可以拆分成两部分:
1、原来比较亮的地方更亮
2、原来亮的地方附近也变亮
用纯数学的方式去表达就是:
1、更亮即 luminance =0.2125 * r + 0.7154 * g + 0.0721 * b 得到的值更大
2、附近也亮即亮点附近的点也变得更亮,这里我们可以使用高斯模糊来实现(高斯模糊是采样附近的点来求得当前点,因此当附近的点较亮时,当前点也会变亮,并且渐进效果好)

Shader代码如下

Shader "Unity Shaders Book/Chapter 12/Bloom" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_Bloom ("Bloom (RGB)", 2D) = "black" {}_LuminanceThreshold ("Luminance Threshold", Float) = 0.5 //亮度阈值(门槛)_BlurSize ("Blur Size", Float) = 1.0}CGINCLUDE#include "UnityCG.cginc"sampler2D _MainTex;half4 _MainTex_TexelSize;sampler2D _Bloom;float _LuminanceThreshold;float _BlurSize;struct v2f {float4 pos : SV_POSITION; half2 uv : TEXCOORD0;}; v2f vertExtractBright(appdata_img v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;return o;}fixed luminance(fixed4 color) {return  0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b; }fixed4 fragExtractBright(v2f i) : SV_Target {fixed4 c = tex2D(_MainTex, i.uv);fixed val = clamp(luminance(c) - _LuminanceThreshold, 0.0, 1.0);return c * val;}struct v2fBloom {float4 pos : SV_POSITION; half4 uv : TEXCOORD0;};v2fBloom vertBloom(appdata_img v) {v2fBloom o;o.pos = UnityObjectToClipPos (v.vertex);o.uv.xy = v.texcoord;      o.uv.zw = v.texcoord;// UNITY_UV_STARTS_AT_TOP 所在的平台是使用Direct3D 纹理坐标是跟OpenGL相反的//因此要做一次 “1-”#if UNITY_UV_STARTS_AT_TOP         if (_MainTex_TexelSize.y < 0.0)o.uv.w = 1.0 - o.uv.w;#endifreturn o; }//将模糊化后的辉光跟原图的颜色进行叠加,实现辉光从亮的地方散发出来的效果fixed4 fragBloom(v2fBloom i) : SV_Target {return tex2D(_MainTex, i.uv.xy) + tex2D(_Bloom, i.uv.zw);} ENDCGSubShader {ZTest Always Cull Off ZWrite OffPass {  CGPROGRAM  #pragma vertex vertExtractBright  #pragma fragment fragExtractBright  ENDCG  }//之前命名Pass的作用就是可以重复利用UsePass "Unity Shaders Book/Chapter 12/Gaussian Blur/GAUSSIAN_BLUR_VERTICAL"UsePass "Unity Shaders Book/Chapter 12/Gaussian Blur/GAUSSIAN_BLUR_HORIZONTAL"Pass {  CGPROGRAM  #pragma vertex vertBloom  #pragma fragment fragBloom  ENDCG  }}FallBack Off
}

C#的部分代码

void OnRenderImage (RenderTexture src, RenderTexture dest) {if (material != null) {material.SetFloat("_LuminanceThreshold", luminanceThreshold);int rtW = src.width/downSample;int rtH = src.height/downSample;RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);buffer0.filterMode = FilterMode.Bilinear;Graphics.Blit(src, buffer0, material, 0);for (int i = 0; i < iterations; i++) {material.SetFloat("_BlurSize", 1.0f + i * blurSpread);RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);// Render the vertical passGraphics.Blit(buffer0, buffer1, material, 1);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);// Render the horizontal passGraphics.Blit(buffer0, buffer1, material, 2);RenderTexture.ReleaseTemporary(buffer0);buffer0 = buffer1;}if (notMerge==false){material.SetTexture ("_Bloom", buffer0);  Graphics.Blit (src, dest, material, 3); }else{Graphics.Blit(buffer0, dest);} RenderTexture.ReleaseTemporary(buffer0);} else {Graphics.Blit(src, dest);}}

Shader部分代码解析:
在SubShader中有 4个Pass
第一个Pass: 利用阈值筛选出需要辉光的点,如果比阈值小, return c * val 在这一步会变成 0,也就是黑色
第二第三个Pass:是上一篇的高斯模糊一样的代码,因为在之前的shader中命名了该Pass,在这里可以直接使用,使用规则如下面两图
第四个Pass:将原图与高斯模糊后的图片进行叠加

C#部分代码解析:
C#中主要就是三个步骤:
1、根据获取亮度分布图
2、将亮度分布图进行高斯模糊
3、将原图和高斯模糊后的亮度分布图叠加
下面分别是:亮度分布图、高斯模糊后的亮度分布图、原图、叠加后的图
叠加后的图之所以变量是因为,原图叠加上模糊后的亮度图内不为黑色的点之后,RBG值变大,则luminance 变大,肉眼看到的感觉就是变亮了



Gif是不断调小亮度阈值得到的,可以看到随着阈值变小,辉光越明显

完整代码的可以去找《UnityShader入门精要》 冯乐乐版本

UnityShader_屏幕后处理之辉光相关推荐

  1. Shader学习23——描边+辉光

    研究了一下Post Processing,简单尝试了一下剑辉光效果 image.png 其实shader基本没啥变化,就是在描边的shader基础上加了点位置判断. 首先我们设置好Post Proce ...

  2. GPU Gems1 - 21 实时辉光(Real-Time Glow)

    这章浅墨的文章讲的很细了,这里基本照扒一遍加深印象,原文链接:https://zhuanlan.zhihu.com/p/36499291 [章节概览] 这章讲到2D光照效果中的辉光(Glow)和光晕( ...

  3. Unity Shader入门学习(5):基础屏幕后处理

    1.后处理基类 //屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效. //基类的作用有二:检测平台是否支持后处理效果,及创建一个用于处理渲 ...

  4. GraphicsLab Project之辉光(Glare,Glow)效果

    作者:i_dovelemon 日期:2016 / 07 / 02 来源:CSDN 主题:Render to Texture, Post process, Glare, Glow, Multi-pass ...

  5. unity屏幕后处理全家桶之color grading

    color grading color grading指的是对最终的游戏界面进行颜色和亮度的改变或矫正.你可以理解为增加滤镜. 屏幕后处理全家桶里的color grading是完全实时hdr工具,内部 ...

  6. PC辉光效果一切正常,安卓辉光却没效果、显示异常(爆闪、黑屏等)

    一:安卓端辉光不显示问题 问题描述:项目中使用unity的PostProcessing package实现辉光的功能,在pc上辉光效果一切正常,但是打出apk在真机测试时,辉光基本没效果. 解决思路: ...

  7. 屏幕后处理——Bloom

    来自于<Unity Shader 入门精要>书本的学习 先上图 代码分3部分 1.PostEffectsBase.cs using System.Collections; using Sy ...

  8. 辉光数码管中挥之不去的记忆

    简 介: 在我小时候的记忆中,所在县城粮油站显示计量白面和大米的电子秤就是使用的辉光数码管.致敬小时候的回忆,寒假制作一个辉光数码灯管,将会用于录制MOOC视频的特色背景动态装饰. 关键词: 辉光数码 ...

  9. 利用MEGA32制作辉光数码管显示电路

    简 介: 为了驱动两个辉光数码管,供有20个数字,使用MEGA32 MCU制作了一个秒表运行驱动电路板. 关键词: 辉光数码管,IN 12,MEGA32 #mermaid-svg-2FBANG5Zss ...

最新文章

  1. 【Qt】使用QCamera获取摄像头,并使用图像视图框架QGraphics*来显示
  2. (前)首富许家印造车果然有一套:车还没量产上市,公司先冲刺科创板募资
  3. 微信小程序-设置启动页面
  4. jQuery操作Select2控件
  5. 【2】信息的表示和处理
  6. 微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)
  7. [转][进阶]-Python3 异步编程详解
  8. 开发一个最简单的Cardboard虚拟现实应用(四)做一个Cardboard第一人称控制器
  9. 查看计算机桌面隐藏文件夹,电脑怎么查看隐藏文件(隐藏文件夹显示方法)
  10. bushound的使用和UVC协议的应用开发
  11. typedef使用方法
  12. 显卡识别为Microsoft基本显示适配器,安装9700k核芯显卡HD630驱动或安装其他核显驱动
  13. 信息系统项目管理师下午论文的一些心得
  14. 计算机主板 上电顺序,BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗?
  15. C语言基础入门,编程的第一步
  16. 嵌入式学习——c的复习
  17. 我国正式实施不安全食品召回制度(转)
  18. 在DCOM配置中找到Microsoft Office Word 97 - 2003 文档
  19. 工具条研究手记(2) - 认识CToolBar工具条类
  20. 成语故事课件PPT模板

热门文章

  1. 微信打开域名网址被拦截 域名网址被微信拦截怎么办
  2. The maximum number of apps for free development profiles has been reached.
  3. 如何使用支付宝支付接口
  4. 关于虚拟机上fedora14不能上网的问题解决
  5. ca加密是什么情况_让我们进行加密:为什么要创建一个免费,自动化和开放的CA?...
  6. Java中this关键字和super关键字用法
  7. Windows XP服务详解
  8. 为什么要阅读计算机经典著作
  9. 计算机视觉论文-2021-03-03
  10. 3D打印机远程挤出与近程挤出的优缺点