首先URP官方已经给了很详细的实现方案,知乎参考链接:https://zhuanlan.zhihu.com/p/248903320
原理就是在渲染所有3D和UI之后通过URP的Cbuffer shader进行屏幕抓取,然后再对抓到的图进行高斯模糊,然后映射到指定的毛玻璃效果的图上。

URP设置

默认的ForwardRender里 层级过滤设为所有,UI层级也好,毛玻璃层级也好都需要被渲染
GrabColor里:通过指定的Blurshader指定抓屏的层级(去掉毛玻璃层),开启抓屏并保存,然后经过高斯模糊,输出到指定的TextureName的RT上。
对需要实现毛玻璃效果的物体添加毛玻璃材质球,此材质球的shader中使用上一步获得的RT,映射出毛玻璃效果
此操作涉及到三个重点:1.URP设置 2.抓屏shader 3.毛玻璃效果shader

抓屏Shader

Shader "WeiLe/Blur_Gaussian"
{Properties{blurRangeX("Blur x", float) = 1blurRangeY("Blur y", float) = 1 }SubShader{Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}LOD 100Pass //pass 0{Name "BlurX"ZTest AlwaysZWrite OffCull OffHLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS       : POSITION;float2 uv               : TEXCOORD0;};struct Varyings{float4 positionCS       : SV_POSITION;float2 uv               : TEXCOORD0;};CBUFFER_START(UnityPerMaterial)float4  _SourceTex_Blur1_ST;float   blurRangeX = 1;float4  _SourceTex_Blur1_TexelSize;CBUFFER_ENDTEXTURE2D (_SourceTex_Blur1);SAMPLER(sampler_SourceTex_Blur1);#define  SampleCount  10Varyings vert(Attributes v){Varyings o = (Varyings)0;o.positionCS = TransformObjectToHClip(v.positionOS.xyz);o.uv.xy  = TRANSFORM_TEX(v.uv.xy, _SourceTex_Blur1);return o;}half4 frag(Varyings i) : SV_Target{UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);half4 col = 0;int s = 0;for (int j = -SampleCount; j <= SampleCount; j++){ int a = SampleCount - abs(j) + 1;s += a;half4 c = a * SAMPLE_TEXTURE2D_X(_SourceTex_Blur1, sampler_SourceTex_Blur1, i.uv + float2(j* blurRangeX * _SourceTex_Blur1_TexelSize.x, 0));col += c;}col /= s;return col;}ENDHLSL}Pass //pass 1{Name "BlurY"ZTest AlwaysZWrite OffCull OffHLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS       : POSITION;float2 uv               : TEXCOORD0;};struct Varyings{float4 positionCS       : SV_POSITION;float2 uv               : TEXCOORD0;};CBUFFER_START(UnityPerMaterial)float4 _SourceTex_Blur2_ST;float4 _SourceTex_Blur2_TexelSize;float blurRangeY = 1;CBUFFER_ENDTEXTURE2D(_SourceTex_Blur2);SAMPLER(sampler_SourceTex_Blur2);#define  SampleCount  10Varyings vert(Attributes v){Varyings o = (Varyings)0;o.positionCS = TransformObjectToHClip(v.positionOS.xyz);o.uv.xy  = TRANSFORM_TEX(v.uv.xy, _SourceTex_Blur2);return o;}half4 frag(Varyings i) : SV_Target{UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);half4 col = 0;int s = 0; for (int j = -SampleCount; j <= SampleCount; j++){int a = SampleCount - abs(j) + 1;s += a;half4 c = a*SAMPLE_TEXTURE2D_X(_SourceTex_Blur2, sampler_SourceTex_Blur2, i.uv + float2(0, j* blurRangeY * _SourceTex_Blur2_TexelSize.y));col += c;}col /= s;return col;}ENDHLSL}}
}

毛玻璃Shader

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "UI/BlurUI_NoTexture"
{Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) = "black" {}_Color ("Tint", Color) = (1,1,1,1)_StencilComp ("Stencil Comparison", Float) = 8_Stencil ("Stencil ID", Float) = 0_StencilOp ("Stencil Operation", Float) = 0_StencilWriteMask ("Stencil Write Mask", Float) = 255_StencilReadMask ("Stencil Read Mask", Float) = 255_ColorMask ("Color Mask", Float) = 15[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0}SubShader{Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent""PreviewType"="Plane""CanUseSpriteAtlas"="True"}Stencil{Ref [_Stencil]Comp [_StencilComp]Pass [_StencilOp]ReadMask [_StencilReadMask]WriteMask [_StencilWriteMask]}Cull OffLighting OffZWrite OffZTest [unity_GUIZTestMode]Blend One OneMinusSrcAlphaColorMask [_ColorMask]Pass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"#pragma multi_compile_local _ UNITY_UI_CLIP_RECT#pragma multi_compile_local _ UNITY_UI_ALPHACLIPstruct appdata_t{float4 vertex   : POSITION;float4 color    : COLOR;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex   : SV_POSITION;fixed4 color    : COLOR;float2 texcoord  : TEXCOORD0;float4 worldPosition : TEXCOORD1;half4  mask : TEXCOORD2;float4 projPos: TEXCOORD3; UNITY_VERTEX_OUTPUT_STEREO};sampler2D _MainTex;fixed4 _Color;fixed4 _TextureSampleAdd;float4 _ClipRect; float4 _MainTex_ST;float _UIMaskSoftnessX;float _UIMaskSoftnessY;sampler2D _BlurTexture;v2f vert(appdata_t v){v2f OUT;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);float4 vPosition = UnityObjectToClipPos(v.vertex);OUT.worldPosition = v.vertex;OUT.vertex = vPosition;OUT.projPos = ComputeScreenPos( vPosition);float2 pixelSize = vPosition.w;pixelSize /= float2(1, 1) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);float2 maskUV = (v.vertex.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);OUT.texcoord = TRANSFORM_TEX(v.texcoord.xy, _MainTex);OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));OUT.color = v.color * _Color;return OUT;}fixed4 frag(v2f IN) : SV_Target{half4 texColor = tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd;half4 color = IN.color * texColor;#ifdef UNITY_UI_CLIP_RECThalf2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);color.a *= m.x * m.y;#endif#ifdef UNITY_UI_ALPHACLIPclip (color.a - 0.001);#endif// color.rgb *= color.a;float2 screenUV = (IN.projPos.xy / IN.projPos.w);half4 blurMap = tex2D(_BlurTexture, screenUV);half3 c = blurMap.rgb *  blurMap.a ;// color.rgb; //加上 rgb相当于使用默认的图片进行模糊,不加相当于只模糊half4 finalColor = float4(c, blurMap.a + (1- blurMap.a)*color.a);//blurMap的alpha值为0的时候表示不使用ui模糊return  finalColor;}ENDCG}}
}

URP实现毛玻璃效果一相关推荐

  1. css毛玻璃效果白边_CSS3毛玻璃效果(blur)有白边问题的解决方法

    做一个登录页,全屏背景图毛玻璃效果,实现方法如下: HTML: var w = window.innerWidth || document.documentElement.clientWidth || ...

  2. 纯css实现毛玻璃效果

    2019独角兽企业重金招聘Python工程师标准>>> 最近有用到毛玻璃效果,在此记录,一方面方便以后使用,另一方面也分享给其他朋友. 先上图: 通过对比,就可以看到效果还是很不错, ...

  3. IOS8的新特性:简洁易用的毛玻璃效果

    探寻IOS8的新亮点:毛玻璃效果的简易实现 IOS8之前,apple官方并不建议开发者使用类似毛玻璃的模糊效果,也并没有开放相关的接口,大部分的开发者是通过转化CGImage这个类来实现毛玻璃的模糊效 ...

  4. iOS 毛玻璃效果的实现方法

    iOS开发中有的时候需要将图片设置模糊,来实现特定的效果获取更好的用户体验, iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,可以通过高斯模糊和毛玻璃效 ...

  5. vscode卸载background插件_使用插件一键启用 Visual Studio Code 的毛玻璃效果

    本文原文发布于我的博客 https://eyhn.in 上一次 我介绍了使用 "Custom CSS and JS Loader" 插件为 MacOS 开启毛玻璃效果.现在我把它做 ...

  6. css毛玻璃效果白边_css3毛玻璃效果白边问题

    注:css3毛玻璃效果应该很多人都知道怎么实现,但是有个问题是图片模糊了之后相当于缩小了,所以颜色深的图片会出现白边,这里说下我参考网上的解决方式吧! 1.毛玻璃实现方法: CSS3 blur滤镜实现 ...

  7. iOS开发之实现毛玻璃效果及图片模糊效果

    毛玻璃效果的实现 App设计时往往会用到一些模糊效果或者毛玻璃效果,iOS目前已提供了一些模糊API可以让我们方便使用.苹果在iOS7.0之后,很多系统界面都使用了毛玻璃效果,增加了界面的美观性,比如 ...

  8. css3 仿aero,让Qt支持Win7的Aero和毛玻璃效果

    Qt5增加了许多特性,其中 Qt Windows Extras 模块就增加了对Win7 Aero 效果的支持. 官网的介绍如下: Qt Windows Extras provide classes a ...

  9. android毛玻璃遮罩效果_css3毛玻璃效果[模糊图片]

    希望有一天大家都能在借鉴中创新 实现图片遮罩的毛玻璃效果代码段很少,这里直接放效果视屏: https://www.zhihu.com/video/1222879519775842304 牵涉关键代码: ...

最新文章

  1. 【构造】CF12E Start of the season(神奇的构造)难度⭐⭐⭐
  2. java计算筛子概率_剑指Offer解题报告(Java版)——n个骰子的点数 43
  3. JavaScript实现网页元素的拖拽效果
  4. java 最优算法_java 问题 求个最优算法
  5. sublime说python找不到_sublime配置python运行环境
  6. python操作mysql,增,删,改,查
  7. P1830 轰炸III
  8. Vscode中HTML与CSS代码的快速写法
  9. CoreData 增删改查
  10. hdu5800_dp
  11. 2017.10.26-构建之法:现代软件工程-阅读笔记
  12. 【crawler笔记】R语言简单动态网页爬虫(rvest包)示例
  13. mac 文字识别软件ocr_树洞OCR文字识别for Mac-树洞OCR文字识别Mac版下载 V1.2.0-PC6苹果网...
  14. 【产品志】华硕 ARUA 的 ARGB 方案
  15. 20182319彭淼迪第一周学习总结
  16. 计算机主板供电,台式机计算机主板供电电路.doc
  17. win10记得pin码 重置密码登录
  18. Linux面试常考命令
  19. dell 台式电脑设置每天定时开机和关机
  20. Python统计学01——数据可视化

热门文章

  1. 小功率机械无级变速器结构设计
  2. 2021 年第一个双月总结
  3. idea run with coverage异常
  4. SCRM升级--企业微信数字营销解决方案
  5. Win11系统右键没有解压选项!!!???
  6. Right Backup(云端数据备份软件)v8.1官方版
  7. 微信小程序“发给朋友”onShareAppMessage,“分享到朋友圈”onShareTimeline,“收藏”onAddToFavorites代码
  8. 中小企业信息安全:基本原则
  9. 说一说 ArrayList 的扩容机制
  10. [FAQ10019]HDMI/MHL如何修改手机默认横竖屏显示方式