webgl智慧楼宇发光系列之线性采样下高斯模糊

简介: webgl智慧楼宇发光系列之线性采样下高斯模糊效率问题线性采样代码讲解总结参考文档

webgl智慧楼宇发光系列之线性采样下高斯模糊


前面一篇文章 <webgl智慧楼宇发光效果算法系列之高斯模糊>, 我们知道了 高斯模糊的本质原理,就是对每个像素,按照正态分布的权重去获取周边像素的值进行平均,是一种卷积操作。


同时我们可以指定周边像素的数量,比如可以是3X3,或者5X5,通用的表达就是N X N, 数字N通常称之为模糊半径,这在之前的文章的代码中有体现(uRadius):


1uniform float uRadius;
 2float gaussianPdf(in float x, in float sigma) {
 3  return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;
 4}
 5void main() {
 6  for( int i = 1; i < MAX_KERNEL_RADIUS; i ++ ) {
 7    float x = float(i);
 8    if(x > radius){
 9      break;
10    }
11    ...
12  }
13  vec4 result = vec4(1.0) - exp(-diffuseSum/weightSum * uExposure);
14  gl_FragColor = result;
15}
16`


效率问题


通常,我们希望模糊的效果越强烈,模糊半径就会要求越大。所谓的半径就是上面的数字N。


我们知道,要实现一个NxN大小的高斯模糊,在纹理的每个像素点,都需要去获取周边N个像素点。因为1024_1024大小的纹理,要实现33 _ 33 大小的高斯模糊,需要访问大概1024 _ 1024 _ 33 * 33≈11.4亿个纹理像素,才能应用整个图像的模糊效果。


为了获得更有效的算法,我们来看看高斯函数的一些特性:

  • 二维高斯函数可以通过将两个一维高斯函数相加来计算。
  • 分布为2σ的高斯函数等于分布为σ的两个高斯函数的乘积。


高斯函数的这两个属性为我们提供了进行大量优化的空间。

基于第一个属性,我们可以将二维高斯函数分成两个一维函数。在使用片段着色器的情况下,我们可以将高斯滤镜分为水平模糊滤镜和垂直模糊滤镜,在渲染后仍可获得准确的结果。这个时候,1024_1024大小的纹理,要实现33 _ 33 大小的高斯模糊,需要访问大概1024 _ 1024 _ 33*2≈6,900万个纹理提取。这种优化明细减少了一个量级。文章 《webgl智慧楼宇发光效果算法系列之高斯模糊》已经实现了这一优化。

第二个属性可用于绕过平台上的硬件限制,这些平台仅在一次pass中仅支持有限数量的纹理提取。


线性采样


到此,我们知道了把一个二维的高斯模糊 分离成两个一维的高斯模糊。效率上也有了大幅度的提高。但是实际上,我们还可以通过线性采样的特性进一步提高效率。


我们知道,要获取一个像素信息,就要做一次贴图的读取。这就意味33个像素信息,就需要做33次贴图的读取操作。但是由于在GPU上面可以随意进行双线线性插值,而没有额外的性能消耗。这就意味着,如果我们不再像素的中心点读取贴图,就可以获得多个像素的信息。如下图所示:


微信图片_20220425133327.png


假设两个像素,我们在像素1中心点读取贴图就是获取像素1的颜色,在像素2中心点读取贴图就是获取像素2的颜色;而在像素1中心点和像素2中心点的某个位置读取贴图,则会获取像素1和像素2的颜色的加权平均的效果。


因为我们做高斯模糊的时候,本身就是获取周边相邻元素的加权平均值,因此利用线性采样的这个特性,可以把原本2个像素的采样,减少为一次采样。如果原本33次采样,则可以减少到17次。


对于两个纹素的采样,需要调整坐标使其与纹素#1中心的距离等于纹素#2的权重除以两个权重之和。同样的,坐标与纹素#2中心的距离应该等于纹素#1的权重除以两个权重之和。


然后我们就有了计算线性采样高斯滤波的权重和位移公式:


微信图片_20220425133331.png


代码讲解


  • 首先定义一个uniform变量,该变量表示是否启用线性采样的方法:


1uniform bool uUseLinear;


  • 然后如果使用线性采样,就把原本的采样次数减少一半:


1 if(uUseLinear){
2    radius = uRadius / 2.0;
3  }


  • 再然后,如果使用线性采样,就使用上述的公式进行像素提取:


1if(uUseLinear){
 2      // http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/
 3      float t1 = 2.0 * x - 1.0,t2 = 2.0 * x ;
 4      float w1 = gaussianPdf(t1,fSigma);
 5      float w2 = gaussianPdf(t2,fSigma);
 6      w = w1 + w2;
 7      t = (t1 * w1 + t2 * w2) / w;
 8    }
 9
10    vec2 uvOffset = uDirection * invSize * t;
11    vec4 sample1 = texture2D( uColorTexture, vUv + uvOffset).rgba;
12    vec4 sample2 = texture2D( uColorTexture, vUv - uvOffset).rgba;
13    diffuseSum += (sample1 + sample2) * w;
14    weightSum += 2.0 * w;


最终的绘制效果如下:


微信图片_20220425133335.png


其中左边的未使用线性采样的机制,而右边的使用了线性采样,可以看出右边再减少了一半的采样的情况下,效果和左边的基本没有差别。


而效率上,通过测试,右边比左边大概提高了40%的渲染效率。


总结


通过线性采样的机制,我们可以看到效率提高了近一倍。这在一些对性能要求高得场景或者移动终端是很有意义。


其实要做出一个好的发光效果,涉及到相关算法是很多了,而且细节之处都需要关注。

先看看我们已经做了得一些发光楼宇得案例吧, 以下都是再简单模型(立方体) + 贴图 + 光照 + 发光 出来得效果,如果模型层面在优化,应该还可以有更酷效果:


微信图片_20220425133339.gif微信图片_20220425133341.png微信图片_20220425133344.png


如果对可视化感兴趣,可以和我交流,微信541002349. 另外关注公众号“ITMan彪叔” 可以及时收到更多有价值的文章。


参考文档

参考文档:http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/

本文部分素材使用了参考文档中的内容。

相关文章
|
SQL 关系型数据库 MySQL
mybatisPlus之自动填充功能及防全表更新与删除插件
mybatisPlus之自动填充功能及防全表更新与删除插件
|
缓存 JavaScript 数据处理
vue computed作用特点及使用场景及示例
vue computed作用特点及使用场景及示例
388 3
|
Java C++ Python
Python 教程之运算符(5)—— Python中的除法运算符
Python 教程之运算符(5)—— Python中的除法运算符
315 1
|
Shell 开发工具 C语言
动态库与静态库
本文目标:⭐认识动态静态库,学会结合gcc选项,制作动静态库⭐⭐了解动态库加载过程⭐。
动态库与静态库
|
算法 Java 编译器
行为型模式 - 访问者模式(Visitor Pattern)
行为型模式 - 访问者模式(Visitor Pattern)
|
云安全 编解码 运维
我眼中的无影云桌面‖云桌面使用者角度
在 2020 云栖大会上,阿里云发布了第一台云电脑“无影”,它的计算资源集中在云端数据中心里,用户通过一个卡片式终端就能接入服务。终端没有 CPU、内存和硬盘,仅名片大小,将它连接到任意的显示器和键盘鼠标上,通过机身配备的指纹识别模块完成开机和登录,用户就可以访问专属桌面、个人数据和各种应用,使用体验与普通电脑没有区别。 本文将从一个云电脑使用者的角度(非专业角度)对阿里云云桌面进行一下测评,力求客观公正,不吹不黑~
13996 2
|
机器学习/深度学习 人工智能 TensorFlow
人工智能|TensorFlow前向传播实例
人工智能|TensorFlow前向传播实例
205 0
|
存储 数据采集 监控
兴业证券:高效VPN日志分析保障疫情防控远程办公精细化管理
疫情常态化,防控更要精细化。 全行业大力推进数字化转型,也为远程办公的便利性与高效性夯实了基础。各行业积极响应,纷纷开启了远程办公模式,向员工大量开放VPN,一时间VPN使用流量及连接峰值屡创新高。VPN远程办公能够帮助员工实现远程登录办公内网,使用OA及邮箱服务器以及访问业务系统,然而不规范的员工登录与操作行为可能导致威胁从个人电脑入侵内网,进而影响到内网更多终端设备。响应疫情防控精细化政策的同时,远程办公安全保障方案更要精细化。
502 0
|
6天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
7953 63
|
3天前
|
人工智能 安全 API
CoPaw:3分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。