最近需要用到这个shader,就稍微研究了一下,这里做一下笔记,免得回来自己忘了~

思路:

看了不少文章,其实都大同小异,分为3步完成。
1,先建一个平面出来(也可以是个精灵),来显示效果。当然你要是准备做屏幕特效那就当我没说,这里不讨论了,只是用法不同。
2,建立我们的shader,我们先用 unity 自带的 GrabPass 采样到当前平面下的像素数据(你就可以想象成屏幕截图)
3,将抓取到的像素数据进行模糊处理

这里说一下模糊处理需要注意的细节,一般做模糊的时候,我们总会想到用高斯模糊,但是其实这个不是最优选择,因为用高斯的话我们还需要建立高斯核,然后不断的用它去对图像进行滤波,次数越多,图像越模糊。
但是实际情况中发现,如果背景里有棱角分明的图像时(比如ui的框框),发现它模糊后,轮廓还是会比较清晰(也就是不够毛)。
所以还有很多其它的思路,核心思想就是破坏图像,让它变糊~
1:先对图像进行向下采样,再做模糊。
我们先把原始图做低画质处理,比如原图100x100,我们把它采样缩成50x50,然后模糊完了以后,我们再把它放大回100x100。
这里还有个偷懒的招,就是用 unity 的 RenderTexture ,这样可以直接采出来一张小的。
2:使用噪声
这没啥好说的,就是用噪声纹理,来改变像素的分布。

当然我懒,还是网上找了个人家写好的shader,当然它有个小问题,就是图像是上下颠倒的,我们反转一下uv坐标的y轴就可以了,它的实现思路就是对像素进行扰动,偏转uv坐标,以达到模糊的效果。
以下是改好了的shader:

Shader "my/FrostedGlass"
{Properties{_blurSizeXY("BlurSizeXY", Range(0,10)) = 2}SubShader{// 透明队列,在所有不透明的几何图形后绘制Tags { "Queue" = "Transparent" }// 采样后面的图像GrabPass { }Pass {CGPROGRAM#pragma target 3.0#pragma debug#pragma vertex vert#pragma fragment fragsampler2D _GrabTexture : register(s0);float _blurSizeXY;struct data {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 position : POSITION;float4 screenPos : TEXCOORD0;};v2f vert(data i){v2f o;o.position = mul(UNITY_MATRIX_MVP, i.vertex);o.screenPos = float4(o.position.x, -o.position.y, o.position.z, o.position.w);return o;}half4 frag( v2f i ) : COLOR{float2 screenPos = i.screenPos.xy / i.screenPos.w;float depth= _blurSizeXY * 0.0005;screenPos.x = (screenPos.x + 1) * 0.5;screenPos.y = 1 - (screenPos.y + 1) * 0.5;half4 sum = half4(0,0,0,0);sum += tex2D( _GrabTexture, float2(screenPos.x-5.0 * depth, screenPos.y+5.0 * depth)) * 0.025;    sum += tex2D( _GrabTexture, float2(screenPos.x+5.0 * depth, screenPos.y-5.0 * depth)) * 0.025;sum += tex2D( _GrabTexture, float2(screenPos.x-4.0 * depth, screenPos.y+4.0 * depth)) * 0.05;sum += tex2D( _GrabTexture, float2(screenPos.x+4.0 * depth, screenPos.y-4.0 * depth)) * 0.05;sum += tex2D( _GrabTexture, float2(screenPos.x-3.0 * depth, screenPos.y+3.0 * depth)) * 0.09;sum += tex2D( _GrabTexture, float2(screenPos.x+3.0 * depth, screenPos.y-3.0 * depth)) * 0.09;sum += tex2D( _GrabTexture, float2(screenPos.x-2.0 * depth, screenPos.y+2.0 * depth)) * 0.12;sum += tex2D( _GrabTexture, float2(screenPos.x+2.0 * depth, screenPos.y-2.0 * depth)) * 0.12;sum += tex2D( _GrabTexture, float2(screenPos.x-1.0 * depth, screenPos.y+1.0 * depth)) *  0.15;sum += tex2D( _GrabTexture, float2(screenPos.x+1.0 * depth, screenPos.y-1.0 * depth)) *  0.15;sum += tex2D( _GrabTexture, screenPos-5.0 * depth) * 0.025;    sum += tex2D( _GrabTexture, screenPos-4.0 * depth) * 0.05;sum += tex2D( _GrabTexture, screenPos-3.0 * depth) * 0.09;sum += tex2D( _GrabTexture, screenPos-2.0 * depth) * 0.12;sum += tex2D( _GrabTexture, screenPos-1.0 * depth) * 0.15;    sum += tex2D( _GrabTexture, screenPos) * 0.16; sum += tex2D( _GrabTexture, screenPos+5.0 * depth) * 0.15;sum += tex2D( _GrabTexture, screenPos+4.0 * depth) * 0.12;sum += tex2D( _GrabTexture, screenPos+3.0 * depth) * 0.09;sum += tex2D( _GrabTexture, screenPos+2.0 * depth) * 0.05;sum += tex2D( _GrabTexture, screenPos+1.0 * depth) * 0.025;return sum / 2;}ENDCG}}Fallback Off
}

不过方法都是大同小异,先采样屏幕,然后对采样到的像素数据想法设法的把它搞糊,就可以了,2333。然后我们看看效果图

模糊前:

模糊后:

PS:这骗文章写的不错,想了解更多的,可以看看
http://www.tuicool.com/articles/ZvQzAfF

毛玻璃,磨砂玻璃材质,shader笔记相关推荐

  1. 外发光材质Shader

    转载自  http://www.unitymanual.com/6943.html 游戏中我们经常会遇到需要制作外发光效果的地方,比如武器,比如坐骑要带一个牛掰的光晕.今天我找到了个好效果: 外发光材 ...

  2. Unity学习shader笔记[一百]简单焦散Caustic效果

    焦散是模仿光透过水底的一个投影景象 有两个版本,改版最后效果如下 这里是简单的基于物体的焦散,基于水体的焦散思路是水面物体的shader中拿到ColorBuffer,然后用水体的屏幕空间坐标取采集Co ...

  3. OpenGL shader笔记

    OpenGL shader笔记 目录 OpenGL shader笔记 uniform varying 访问顶点 访问顶点--颜色 访问顶点属性--法线  gl_Normal 访问顶点--纹理坐标 at ...

  4. Unity双面材质Shader

    Unity双面材质Shader. 正面渲染支持漫反射贴图.法线贴图.高光度等.背面渲染支持漫反射贴图. Shader代码如下: Shader "LiangHaoXiangShaders/Do ...

  5. threejs 源码解析_ThreeJS 物理材质shader源码分析(顶点着色器)

    ThreeJS 物理材质shader源码分析(顶点着色器) Threejs将shader代码分为ShaderLib和ShaderChunk两部分,ShaderLib通过组合ShaderChunk的代码 ...

  6. unity build-in管线中的PBR材质Shader分析研究

    PBR分析 前言 我理解的PBR PBR组成部分 直接光漫反射 直接光镜面反射(高光) 间接光漫反射 间接光镜面反射 最终加和 结果 前言 近来,用到了几次Surface Shader,对于其封装好的 ...

  7. Unity 自定义自发光材质 shader (对比Standard Eimission)

    自定义自发光shader的时候会遇到 同样的HDR 颜色,但是standard表现正常而自己写的shader不正常的情况. 原因是因为Bloom效果是基于 standard的泛光材质调的,而自己写的E ...

  8. Unity海洋shader笔记①

    不久前玩了神秘海域4和盗贼之海,对游戏中形状生动颜色通透的大海产生了兴趣,于是开始查着资料学习自己动手写一个海洋的水效渲染.这个shader基本是边学边写的,编写过程中我学到了很多新的知识. 目前的效 ...

  9. UE5——材质学习笔记(1)

    前言:本系列笔记记录UE上各种常见材质的制作方法: 文章目录 1.失真(水流扰动)材质 说明 分析 texCoord节点 2.动画材质 说明 分析 flipbook节点 frac节点 floor节点 ...

最新文章

  1. linux 内核源代码漫游,Linux内核源代码漫游——
  2. BFS最短路打印路径
  3. Unfair contest 模拟-分类讨论
  4. SQL注入之布尔盲注——sql-lab第八关
  5. 引用管理器没有程序集_Microsoft弃用远程桌面连接管理器
  6. python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...
  7. oracle 计算中位数,SQL 如何计算每个分组的中位数
  8. 正则表达式matlab,正则表达式中一个word的匹配 @MATLAB - 优秀的Free OS(Linux)版 - 北大未名BBS...
  9. postgresql 字符串转整数 int、integer
  10. 对 BatchNormalization 中 Internal Convariate Shift 的理解
  11. 2021-08-15 reponse文件下载路径
  12. GridView 中如何给删除按钮添加提示
  13. AutoCAD自定义填充图样详细教程
  14. Topaz ReMask 5 for Mac(抠图神器)
  15. 微信公众账号开发模式3
  16. mysql怎么创建外表_MYSQL数据去重与外表填充
  17. 大疆网上测评题库_大疆校招笔试题及参考(一个小编程题)
  18. ByVal和ByRef的区别
  19. 电脑升级建议(加固态硬盘还是内存、CPU、显卡)
  20. [源庚]花开的瞬间——大本营全分析

热门文章

  1. 视频文件打不开怎么修复
  2. 用计算机描点法画方程函数图像,函数的三种表示方法及用描点法画函数图像.——青夏教育精英家教网——...
  3. 【U8】禁止UU(UTU)随登陆账套启动(U8V11.0及其以上版本)
  4. 计算机关机键消失了,电脑关机键不见了,没有了关机按钮怎么办
  5. Linux下硬盘安装fedora,Fedora 10硬盘安装教程
  6. 形式逻辑三大基本要素-推理的本质
  7. 代码加密 android,Android 开发怎样做代码加密或混淆
  8. 少一点张扬,多一点谦虚;少一点英雄主义,多一点实事求是——读2008第11期《IT经理世界》
  9. WebShell箱子简介与原理
  10. Django之django-dynamic-preferences