某天项目中美术大哥们提出使用Bloom的需求。但是直接使用Unity 的PostProcess Bloom性能消耗又很大。
所以开发了一个简单的Bloom效果,能满足基本需求,又能兼顾性能。**使用方法:**场景中摄像机挂上C# 脚本。然后用此Shader 创建材质球,放在C# 脚本GO上。
**注意:**因为用的OnRenderImage,这个只在Game 窗口有效果。

Shader代码:

Shader "Hidden/CustomBloom"
{CGINCLUDE#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_TexelSize;float _Threshold;sampler2D _BloomTex;float _Intensity;float3 ApplyBloomThreshold (float3 color)
{float br = max(max(color.r, color.g), color.b);br = max(0.0f, (br - _Threshold)) / max(br,0.00001f);color.rgb *= br;return color;
}//阈值half4 frag_PreFilter(v2f_img i) : SV_Target{float3 color = 0;float weightSum = 0.0;float2 offsets[] = {float2(0.0, 0.0),float2(-1.0, -1.0), float2(-1.0, 1.0), float2(1.0, -1.0), float2(1.0, 1.0)};for (int j = 0; j < 5; j++){float3 c = tex2D(_MainTex, i.uv + _MainTex_TexelSize.xy * offsets[j]);c = ApplyBloomThreshold(c);//通过明度权重削弱图像变化时产生的闪烁float w = 1.0 / (Luminance(c) + 1.0);color += c * w;weightSum += w;}return float4(color, 1);}//降采样模糊half4 frag_DownsampleBox(v2f_img i) : SV_Target{half4 d = _MainTex_TexelSize.xyxy * half4(-1,-1,1,1);half4 s = 0;s += tex2D(_MainTex, i.uv + d.xy);s += tex2D(_MainTex, i.uv + d.zy);s += tex2D(_MainTex, i.uv + d.xw);s += tex2D(_MainTex, i.uv + d.zw);s *= 0.25;return s;}//升采样模糊half4 frag_UpsampleBox(v2f_img i) : SV_Target{half4 d = _MainTex_TexelSize.xyxy * half4(-1,-1,1,1);half4 color = 0;color += max(tex2D(_MainTex, i.uv + d.xy), 0.0001);color += max(tex2D(_MainTex, i.uv + d.zy), 0.0001);color += max(tex2D(_MainTex, i.uv + d.xw), 0.0001);color += max(tex2D(_MainTex, i.uv + d.zw), 0.0001);color *= 0.25;//return color;half4 color2 = tex2D(_BloomTex, i.uv);return color + color2;}//合并half4 frag_Combine(v2f_img i) : SV_Target{half4 d = _MainTex_TexelSize.xyxy * half4(-1,-1,1,1);half4 base_color = tex2D(_MainTex, i.uv);half4 bloom_color = tex2D(_BloomTex, i.uv);half3 final_color = base_color.rgb + bloom_color.rgb * _Intensity;return half4(final_color,1.0);}ENDCGProperties{_MainTex ("Texture", 2D) = "white" {}_BlurOffset("BlurOffset",Float) = 1 }SubShader{Cull Off ZWrite Off ZTest Always//0 阈值Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag_PreFilterENDCG}//1 降采样模糊Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag_DownsampleBoxENDCG}//2 升采样模糊Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag_UpsampleBoxENDCG}//3 合并Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag_CombineENDCG}}
}

C#代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode()]
public class CustomBloom : MonoBehaviour {public Material material;[Range(0, 10)]public float _Intensity = 1;[Range(0, 10)]public float _Threshold = 1;void Start () {if (material == null || SystemInfo.supportsImageEffects == false|| material.shader == null || material.shader.isSupported == false){enabled = false;return;}}void OnRenderImage(RenderTexture source, RenderTexture destination){RenderTexture RT1 = RenderTexture.GetTemporary(source.width / 2, source.height / 2,0,source.format);RenderTexture RT2 = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, source.format);RenderTexture RT3 = RenderTexture.GetTemporary(source.width / 8, source.height / 8, 0, source.format);RenderTexture RT4 = RenderTexture.GetTemporary(source.width / 16, source.height / 16, 0, source.format);RenderTexture RT5 = RenderTexture.GetTemporary(source.width / 32, source.height / 32, 0, source.format);RenderTexture RT6 = RenderTexture.GetTemporary(source.width / 64, source.height / 64, 0, source.format);RenderTexture RT5_up = RenderTexture.GetTemporary(source.width / 32, source.height / 32, 0, source.format);RenderTexture RT4_up = RenderTexture.GetTemporary(source.width / 16, source.height / 16, 0, source.format);RenderTexture RT3_up = RenderTexture.GetTemporary(source.width / 8, source.height / 8, 0, source.format);RenderTexture RT2_up = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, source.format);RenderTexture RT1_up = RenderTexture.GetTemporary(source.width / 2, source.height / 2, 0, source.format);RenderTexture[] rt_list = new RenderTexture[] { RT1 , RT2, RT3, RT4, RT5, RT6,RT5_up,RT4_up,RT3_up,RT2_up,RT1_up};float intensity = Mathf.Exp(_Intensity / 10.0f * 0.693f) - 1.0f;material.SetFloat("_Intensity", intensity);material.SetFloat("_Threshold", _Threshold);//阈值Graphics.Blit(source, RT1, material,0);//模糊(降采样)Graphics.Blit(RT1, RT2, material, 1);Graphics.Blit(RT2, RT3, material, 1);Graphics.Blit(RT3, RT4, material, 1);Graphics.Blit(RT4, RT5, material, 1);Graphics.Blit(RT5, RT6, material, 1);//模糊(升采样)material.SetTexture("_BloomTex", RT5);Graphics.Blit(RT6, RT5_up, material, 2);material.SetTexture("_BloomTex", RT4);Graphics.Blit(RT5_up, RT4_up, material, 2);material.SetTexture("_BloomTex", RT3);Graphics.Blit(RT4_up, RT3_up, material, 2);material.SetTexture("_BloomTex", RT2);Graphics.Blit(RT3_up, RT2_up, material, 2);material.SetTexture("_BloomTex", RT1);Graphics.Blit(RT2_up, RT1_up, material, 2);//合并material.SetTexture("_BloomTex", RT1_up);Graphics.Blit(source, destination, material, 3);//releasefor (int i = 0; i < rt_list.Length; i++){RenderTexture.ReleaseTemporary(rt_list[i]);}}
}

Unity 给手游用的高性能辉光(Bloom) Shader相关推荐

  1. Unity关于手游端摇杆移动、摇杆按钮冲突问题

    Unity关于手游端摇杆移动.摇杆按钮冲突问题 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 **Unity关于手游端摇杆移动.摇杆按钮冲突问题** 一.摇杆移动问题 1 ...

  2. Unity开发手游常用适配分辨率

    前言 工作开发中常用的需要适配的手机适配,这里做一下记录. 分辨率 1.新增分辨率 AspectRatio是长宽比,FixedResolution是设置固定分辨率. 2.适配长宽比 平时开发用9:16 ...

  3. Unity 2D手游——坦克大战 C#

    需要下载项目的朋友,请打开CSDN链接:Unity2D坦克大战项目工程 本项目涉及到的功能: 1.UI部分: a .游戏开始界面UI       b.主场景UI      c.游戏胜利界面UI     ...

  4. THREEJS辉光与景深特效

    效果预览 辉光效果: 景深效果: 核心代码 辉光和景深尽量把场景背景设置为黑色,要不影响效果. // 设置场景背景色为黑色 scene.background = new THREE.Color(0, ...

  5. threejs 辉光的使用 在vue

    引入插件 import {EffectComposer} from "three/examples/jsm/postprocessing/EffectComposer.js";im ...

  6. 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步

    http://king.shandian.biz/88.html 如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知 ...

  7. 《秦时明月世界》手游如何用Unity定制化渲染管线?

    由玄机科技正版授权.魔方工作室群研发的经典国漫IP改编手游<秦时明月世界>,收获了广大玩家和原著粉丝们的一致好评,在TapTap上评分高达8.6.这款游戏是魔方工作室对3D大世界MMO的首 ...

  8. Unity手游开发札记——移动平台的天气系统实现

    0. 牢骚 我发现,每个月的20+号是我有精力写博客的时间-- 这次项目算是经历的第一次严格意义上的渠道测试,更换了正式名称,见了更多玩家,开发组也经历的更多通宵--评价和数据如何暂时还未揭晓,趁着没 ...

  9. Unity手游之路十自动寻路Navmesh之跳跃,攀爬,斜坡

    转载 Unity手游之路<十>自动寻路Navmesh之跳跃,攀爬,斜坡 分类: unity2013-12-27 00:50 6545人阅读 评论(5) 收藏 举报 unity3dNavme ...

最新文章

  1. android tombstone发生过程,Android Tombstone 分析
  2. python使用joblib模块保存和加载机器学模型
  3. python比c语言好学吗-学C语言好还是Python好?
  4. 注解参数怎么使用变量_硅橡胶胶水有哪些特点?使用参数表现的怎么样?如何储存?...
  5. 2017-10-06-构建之法:现代软件工程-阅读笔记
  6. Visual Studio 2017
  7. 库克回应 iPhone 11 系列不支持 5G;哈啰 App 被下架;Flutter 1.9 稳定版发布 | 极客头条...
  8. android快速开发框架_【程序源代码】springboot和ssm的极速轻量快速开发框架
  9. 安装2000数据库的时候挂起
  10. Moloch网络流量分析工具
  11. 自走棋手游服务器稳定,2020最火的自走棋手游
  12. docker---dockerfile 编写优化
  13. 【day4】【洛谷算法题】-P5708三角形面积-刷题反思集[入门1顺序结构]
  14. CSS浏览器兼容性的4个解决方案
  15. 前端实现 导出图片,导出PDF(截图原理)
  16. Python爬虫入门教程13:高质量电脑桌面壁纸爬取
  17. smartbi v7 Linux,Smartbi版本更新
  18. 性能测试,CPU使用率CPU负载率理解
  19. 解决windows10环境下conda创建环境出现 No writeable pkgs directories configured
  20. deployer安装

热门文章

  1. 计算机病毒的关键技术,计算机病毒实验系统关键技术研究与实现
  2. 程序员漫画集连载[1]
  3. 手机无线网络 dns服务器设置,iPhone手机网速慢?1分钟教你设置DNS,网速立马翻一番...
  4. 前端微信小程序资讯类仿今日头条微信小程序
  5. natapp邀请码,新用户购买域名可以享受9折优惠
  6. R语言 grf包-heterogeneous treatment effect
  7. 走进WebAssembly
  8. 对于小白,创建一个网站你需要做什么?
  9. Centos7下安装Sentry22.1.0,接入LDAP
  10. Ebox系列Corecon不同版本不宜安装在一起