当前位置: 首页 > 编程日记 > 正文

屏幕后处理——Bloom

来自于《Unity Shader 入门精要》书本的学习

先上图

代码分3部分

1.PostEffectsBase.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//在编辑器状态下可执行该脚本来查看效果
[ExecuteInEditMode] 
//屏幕后处理特效一般需要绑定在摄像机上
[RequireComponent(typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {void Start () {CheckResources();}protected void CheckResources(){bool isSupported = CheckSupport();//如果显卡检测 返回falseif (isSupported == false){//NotSupported()方法,即不显示
            NotSupported();}}//检查显卡是否支持protected bool CheckSupport(){//如果显卡不支持图像后期处理if (SystemInfo.supportsImageEffects == false){//返回falsereturn false;}//如果支持图像后处理,返回truereturn true;}//图像不显示protected void NotSupported(){enabled = false;}//CheckShaderAndCreateMaterial函数接受两个参数,第一个参数指定了改特效需要使用的Shader//第二个参数则是用于后期处理的材质。该函数首先检查Shader的可用性,检查通过后就返回一个使//用了该shader的材质,否则返回null.protected Material CheckShaderAndCreateMaterial(Shader shader, Material material){   //如果shader为空if (shader == null){return null;}//shader.isSupported:能在终端用户的图形卡上运行这个着色器&& 并且存在material 他的shader是我们输入的shaderif (shader.isSupported && material && material.shader == shader){return material;}if (!shader.isSupported){return null;}//上面都不满足的话,重新创建新的材质球else{material = new Material(shader);//hideFlags:控制对象销毁的位掩码//HideFlags.DontSave对象不会保存到场景中。加载新场景时不会被破坏。material.hideFlags = HideFlags.DontSave;return material;}}}

2.bloom.using System.Collections;

using System.Collections.Generic;
using UnityEngine;public class bloom : PostEffectsBase {public Shader bloomShader;private Material bloomMaterial;public Material material{get{//根据PostEffectsBase中的方法检测,第一个参数指定了该特效需要使用的Shader,第二个参数则是用于后期处理的材质;//该函数首先检查Shader的可用性,检查通过后返回一个使用了该shader的材质,否则返回Null.bloomMaterial = CheckShaderAndCreateMaterial(bloomShader, bloomMaterial);return bloomMaterial;}}//高斯模糊的叠带次数[Range(0, 4)]public int iterations = 3;//高斯模糊的叠带范围[Range(0.2f, 4.0f)]public float blurSpread = 0.6f;//降采样的数值[Range(1, 8)]public int downSample = 2;//luminanceThreshold,大多数情况下图像亮度不会超过1.但如果我们开启了HDR,硬件会允许我们把颜色值储存在一个更高精度范围的缓冲中,//此时像素的亮度就会超过1.[Range(0.0f, 4.0f)]public float luminanceThreshold = 0.6f;//OnRenderImage函数void OnRenderImage (RenderTexture src , RenderTexture dest){if (material != null){material.SetFloat("_luminanceThreshold", luminanceThreshold);//将图像进行降采样不仅可以减少需要处理的像素,提高性能,而且适当的降采样旺旺还可以得到更好的模糊效果int rtW = src.width / downSample;int rtH = src.height / downSample;//定义第一个缓存buffer0,并吧src中的图像缩放后储存到buffer0中。RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);buffer0.filterMode = FilterMode.Bilinear;//调用shader中的第一个Pass提取图像中较亮的区域,提到的较亮区域将储存在buffer0 中。Graphics.Blit(src, buffer0, material, 0);for (int i = 0; i < iterations; i++){material.SetFloat("_BlurSize", 1.0f + i * blurSpread);//定义buffer1RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);//调用第二个pass,输入buffer0,输出buffer1.Graphics.Blit(buffer0, buffer1, material, 1);RenderTexture.ReleaseTemporary(buffer0);//将输出的buffer1重新赋值给buffer0buffer0 = buffer1;buffer1 = RenderTexture.GetTemporary(rtW, rtH,0);//调用第三个pass,输入buffer0(上面输出的buffer1),输出buffer1(新的buffer1)Graphics.Blit(buffer0, buffer1, material, 2);//将新的buffer1再次给buffer0赋值buffer0 = buffer1;}//第四个Pass,将buffer0赋值给贴图_Bloommaterial.SetTexture("_Bloom", buffer0);Graphics.Blit(src, dest, material, 3);RenderTexture.ReleaseTemporary(buffer0);}else{Graphics.Blit(src, dest);}}

}

3.bloom.shader

Shader "Unlit/Bloom"
{Properties{_MainTex ("Texture", 2D) = "white" {}//高斯模糊较亮的区域 _Bloom ("Bloom(RGB)",2D) = "Black"{}//阔值,提取大于这个亮度的区域 后面将在 大于这个值 的区域里进行高斯模糊_luminanceThreshold("luminanceThreshold",Float) = 0.5//控制不同迭代之间高斯模糊的模糊区域范围  也就是uv偏移的范围_BlurSize ("Blur Size",Float) = 1.0}SubShader{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;}//通过主贴图得到一个灰度值
        fixed4 luminance (fixed4 color){return 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b;}fixed4 fragExtractBright (v2f i ):SV_Target {///我们降采样得到的亮度值减去阔值_luminanceThreshold,并把结果截取到0到1的范围内,然后///我们把该值和原像素相乘,得到提取后的两部区域///这样就是低于_luminanceThreshold显示为黑色fixed c = tex2D(_MainTex , i.uv);//clamp(x,a,b),如果x<a,返回a,x>b,返回b,否则返回为x;fixed val = clamp (luminance(c) - _luminanceThreshold, 0.0, 1.0);return c * val;}///使用Unity提供的_MainTex_Texel_TexelSize变量,计算相邻文理坐标的的偏移(也是高斯模糊的写法)//竖方向跟横方向的两个顶点着色器公用的v2f输出定义struct v2fBlur {float4 pos : SV_POSITION;half2 uv[5]:TEXCOORD0;};//竖直方向的
        v2fBlur vertBlurV (appdata_img v){v2fBlur o;o.pos = UnityObjectToClipPos (v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2 (0.0,_MainTex_TexelSize.y * 1.0) * _BlurSize;o.uv[2] = uv - float2 (0.0,_MainTex_TexelSize.y * 1.0) * _BlurSize;o.uv[3] = uv + float2 (0.0,_MainTex_TexelSize.y * 2.0) * _BlurSize;o.uv[4] = uv - float2 (0.0,_MainTex_TexelSize.y * 2.0) * _BlurSize;return o;}//水平方向的
        v2fBlur vertBlurH (appdata_img v){v2fBlur o;o.pos = UnityObjectToClipPos (v.vertex);half2 uv = v.texcoord;o.uv[0] = uv;o.uv[1] = uv + float2 (_MainTex_TexelSize.x * 1.0 , 0.0) * _BlurSize;o.uv[2] = uv - float2 (_MainTex_TexelSize.x * 1.0 , 0.0) * _BlurSize;o.uv[3] = uv + float2 (_MainTex_TexelSize.x * 2.0 , 0.0) * _BlurSize;o.uv[4] = uv - float2 (_MainTex_TexelSize.x * 2.0 , 0.0) * _BlurSize;return o;}//定义两个pass公用的片元着色器
        fixed4 fragBlur (v2fBlur i) : SV_Target{float weight [3] = {0.4026, 0.2442, 0.0545};fixed3 sum = tex2D (_MainTex,i.uv[0]).rgb * weight[0];for (int j = 1; j<3; j++ ){sum += tex2D(_MainTex,i.uv[j*2-1]).rgb * weight[j];sum += tex2D(_MainTex,i.uv[j*2]).rgb * weight[j];}return fixed4 (sum,1.0);}///混合亮部图像和原图像时使用的 顶点.片元 着色器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;#if UNITY_UV_STARTS_AT_TOPif (_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);}ENDCGZTest Always Cull Off ZWrite Off pass { CGPROGRAM#pragma vertex vertExtractBright#pragma fragment  fragExtractBrightENDCG}pass {CGPROGRAM#pragma vertex vertBlurV#pragma fragment  fragBlurENDCG}pass {CGPROGRAM#pragma vertex vertBlurH#pragma fragment  fragBlurENDCG}pass {CGPROGRAM#pragma vertex vertBloom#pragma fragment  fragBloomENDCG}}FallBack Off
}

转载于:https://www.cnblogs.com/baicaishisan/p/7693146.html

相关文章:

服务端口大全+注解

端口&#xff1a;0服务&#xff1a;Reserved说明&#xff1a;通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口&#xff0c;当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描&#xff0c;使用IP地址为0.0.0.0&#xff0c;设置ACK…

双绞线是计算机网络的一种通信线路吗,计算机网络环境的信道传输技术分析

韩长军【摘要】计算机网络的产生对人类文明进步树立了新标杆&#xff0c;促进了人们的交流&#xff0c;对于人类社会信息获得的途径以及咨询传播方式等等也产生了极其重大的影响。数据密集程度较高的科学和工程&#xff0c;比如、水文观测、地壳波动资料、气象行业等等&#xf…

为了智能驾驶,李彦宏要改造城市道路

10 月 18 日&#xff0c;在世界智能网联汽车大会上&#xff0c;百度 CEO 李彦宏提到&#xff1a;当汽车变得越来越智能&#xff0c;道路的基础设施也必须跟着变&#xff0c;必须进行改造。 李彦宏在发言中表示&#xff0c;“很多自动驾驶汽车都是需要依赖极其昂贵的激光雷达来实…

美团大脑:知识图谱的建模方法及其应用 | 公开课笔记

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑分享嘉宾 | 王仲远&#xff08;美团 AI Lab NLP 中心负责人&#xff09;整 理 | 周翔出 品 | AI科技大本营作为人工智能时代最重要的知识表示方式之一&#xff0c;知识图谱能够打破不同场景下的数据隔离&#xff0c;为搜…

LINQ篇:ASP.NET using LINQ(Part One) Scott大师的产物

【原文地址】Using LINQ with ASP.NET (Part 1) 【原文发表日期】Sunday, May 14, 2006 9:49 PM 最近使我激动不已的新鲜事之一就是LINQ系列技术的出现&#xff0c;包括LINQ&#xff0c;DLINQ&#xff0c;XLINQ和不久后的其他技术。 LINQ将被完全集成到代号为Orcas的下个版本Vi…

大学生如何合理使用计算机,大学生计算机合理使用引导分析

摘 要&#xff1a;在当今社会中&#xff0c;计算机已经成为大家工作与生活不可缺少的工具。而在大学校园内&#xff0c;越来越多的学生也拥有了自己的计算机。计算机不仅可以帮助大学生进行学习活动&#xff0c;还能使学生在紧张学习之余进行娱乐放松。但是&#xff0c;大学生在…

关于机器学习中山峰聚类算法的说明

前言在之前关于聚类算法的文章中&#xff0c;笔者主要涉及的内容均是和参数求解相关的&#xff0c;如C均值&#xff08;包括模糊C均值&#xff09;、混合高斯模型等&#xff0c;而对于一些无参数密度估计的算法尚未讨论&#xff0c;而且一般基于参数密度估计的算法均是建立在假…

SQLDMO- (数据备份与恢复篇)

引用usingSystem;usingSystem.Collections.Generic;usingSystem.Text;publicsealedclassDbOper { /**//// <summary> /// DbOper类的构造函数 /// </summary> private DbOper() { } /**//// <summary> /// 数据库备份 /// </summary> …

详细介绍Java垃圾回收机制

垃圾收集GC&#xff08;Garbage Collection&#xff09;是Java语言的核心技术之一&#xff0c;之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性&#xff0c;但在JVM的内部运行机制上看&#xff0c;Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对…

美国卡尔顿学院计算机专业怎么样,美国卡尔顿学院排名

在学术上&#xff0c;卡尔顿学院在美国处于领先地位。被美国新闻与世界报道评为全美前10位的文理学院卡尔顿学院排名卡尔顿学院是明尼苏达州菲尔德市一所历史悠久的文科私立院校&#xff0c;一直奉行无宗教派别男女合校制度。卡尔顿学院始建于1866年&#xff0c;经过一百多年的…

比特大陆发力边缘计算,详解终端AI芯片BM1880

作者 | 中国科学院微电子研究所 剑白 前不久比特大陆推出其云端人工智能芯片--SOPHON(算丰)BM1682芯片&#xff0c;BM1682是比特大陆设计&#xff0c;并对图像、视频等处理给予额外辅助支持的人工智能硬件加速芯片&#xff0c;其峰值运算速度为3TFLOPs&#xff0c;可提供给用户…

职称计算机 菏泽,山东菏泽2016年职称计算机首批考试时间

一、考试范围及科目(模块)1、参加2016年全国专业技术人员计算机应用能力考试的人员&#xff0c;须按照《2014版全国专业技术人员计算机应用能力考试科目(模块)代码表》(以下简称《2014版考试科目》)(见附件1)所列科目(模块)要求进行报名考试。2、评聘中级专业技术职务者&#x…

GitHub 挂了

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑今天早上&#xff0c;全球最大的同性交友网站 GitHub 出现大规模宕机&#xff0c;你中招了没有&#xff1f;▌GitHub“挂了”“见鬼&#xff1f;&#xff1f;&#xff1f;”&#xff0c;一位 Twitter 用户评论道&#xff0c;“…

在ARC环境中autoreleasepool(runloop)的研究

引言 最近有个大佬考察了我关于autoreleasepool的了解, 之前一直认为自己了解, 但是稍微一问深, 自己却哑口无言. 仔细思考了下, 决定要将这个问题结合之前的知识从新梳理一下, 当然, 实践是必不可少的. main函数中的autoreleasepool的作用?系统的autoreleasepool我们自己创建…

QoS实验配置详解

QoS---CQ&#xff08;定制队列&#xff09;学习CQ&#xff08;定制队列&#xff09;的配置&#xff1b;本实验首先用ACL定义一些流量。然后再将这些流量进行先后排队&#xff0c;最后将排好队的流量策略应用到接口上 1 过滤流量R2(config)#access-list 101 permit ospf any any…

朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | 杨秀璋&#xff08;笔名&#xff1a;Eastmount&#xff09;&#xff0c;贵州财经大学信息学院老师&#xff0c;硕士毕业于北京理工大学&#xff0c;主要研究方向是Web数据挖掘、知识图谱、Python数据分析、图像识别等。…

计算机应用基础试题及答案试卷号7074,阅读文章,完成试题。后来才知道,在这千钧一发的时刻,是郝副营长划着了火柴,点燃了那本书,举得高高的, - 学进去中小学试卷试题库...

阅读《苏州园林》(节选)&#xff0c;回答问题。苏州园林(节选)叶圣陶①苏州园林据说有一百多处&#xff0c;我到过的不过十多处。其他地方的园林我也到过一些。倘若要我说说总的印象&#xff0c;我觉得苏州园林是我国各地园林的标本。②设计者和匠师们因地制宜&#xff0c;自出…

解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”...

[VS2005]解决“由于应用程序的配置不正确&#xff0c;应用程序未能启动&#xff0c;重新安装应用程序可能会纠正这个问题” 今天在准备发布用VS2005写的那个程序时&#xff0c;拷贝到我同事机器上&#xff0c;双击突然出现了“由于应用程序的配置不正确&#xff0c;应用程序未能…

PHP实时生成并下载超大数据量的EXCEL文件

最近接到一个需求&#xff0c;通过选择的时间段导出对应的用户访问日志到excel中&#xff0c; 由于用户量较大&#xff0c;经常会有导出50万加数据的情况。而常用的PHPexcel包需要把所有数据拿到后才能生成excel&#xff0c; 在面对生成超大数据量的excel文件时这显然是会造成内…

小学三年级上册计算机计划书,小学三年级班主任工作计划书

教学计划是教师个人制定的工作计划&#xff0c;通常为一个学期&#xff0c;内容主要包括制定教学计划的指导思想、教学内容以及教学目标&#xff0c;最重要的是每个教师要针对自己所带的学生特点来制定计划&#xff0c;因材施教才是对我们学生最好的教育.一、指导思想端正学习态…

10行代码爬取全国所有A股/港股/新三板上市公司信息

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | 高级农民工本文已获原作者授权&#xff0c;如需转载&#xff0c;请联系原作者。摘要&#xff1a; 我们平常在浏览网页中会遇到一些表格型的数据信息&#xff0c;除了表格本身体现的内容以外&#xff0c;可能还想透过表格…

阿里云前端周刊 - 第 29 期

推荐 1. RESTful API 设计最佳实践 https://blog.philipphauer.de/... 项目资源的URL应该如何设计&#xff1f;用名词复数还是用名词单数&#xff1f;一个资源需要多少个URL&#xff1f;用哪种HTTP方法来创建一个新的资源&#xff1f;可选参数应该放在哪里&#xff1f;那些不涉…

Flash传值给asp页面

1.LoadVars的load方法&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;在flash中写一个拉出两个动态文件框&#xff0c;变量名为myName与myPsd&#xff0c;拉出一组件button&#xff0c;名为&#xff1a;submit_button&#xff0c;用于提交&#xff0c;再拉出一T…

《深度学习500问》,川大优秀毕业生的诚意之作

前端工程师掌握这18招&#xff0c;就能在浏览器里玩转深度学习基于知识图谱的人机对话系统 | 公开课笔记来呀&#xff01;AI喊你斗地主美团大脑&#xff1a;知识图谱的建模方法及其应用 | 公开课笔记60天,4位诺奖得主,他们将这样改造区块链程序员的江湖&#xff0c;务必掌握这些…

UC阿里鱼卡全网免流活动正在进行

UC&阿里鱼卡全网免流活动正在进行 优酷、虾米、高德、书旗应用专属流量免费 赠送100分钟国内通话、1G全国流量 扫码立即免费申请

普渡大学计算机硕士申请条件,普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单...

2020年普渡大学计算机与信息技术理学硕士申请要求及普渡大学计算机与信息技术理学硕士申请材料要求清单是学生很感兴趣的问题&#xff0c;下面指南者留学整理2020年普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单供大家参考。其中包括2020年普渡大学计算机…

object.ReferenceEquals(a,b)

code1 Assert.IsFalse(object.ReferenceEquals(10, 10));//比较时&#xff0c;要把比较的东西Box成Object&#xff0c;二个Ojbec地址是不一样的。 2 3 int value 10; 4 object one value; 5 object two value; 6 As…

深度文本匹配在智能客服中的应用

参加2018 AI开发者大会&#xff0c;请点击↑↑↑作者 | 云知声目录一. 深度文本匹配的简介1. 文本匹配的价值2. 深度文本匹配的优势3. 深度文本匹配的发展路线二. 智能客服的简介1. 智能客服的应用背景2. 智能客服的核心模块FAQ 库的构建语义召回相似度模型模型更新三. 深度文本…

计算机辅助焊接过程控制,重型车辆计算机辅助焊接工艺自动设计系统.pdf

金属学与金属工艺维普资讯第26卷 第10期 焊 接 学 报 v。1&#xff0e;26 N。&#xff0e;102005年 10月 TRANSACTIONSOFTHECHINAWELDINGINSTITUTION October 2005重型车辆计算机辅助焊接工艺 自动设计系统王克鸿&#xff0c; 韩 杰&#xff0c; 李 帅 王佳军(南京理工大学 材料…

Linux--文件管理以及权限的修改

一、文件属性查看ls -l filename 目录属性的大小&#xff08;文件名的字符总和&#xff09;-|rw-r--r--.|1| root| root| 46 |Oct 1 05:03 |filename— ————————— — ———— ———— —— ———————————— ———————— 1 …