高斯模糊,是一种使画面产生朦胧感的技术。在游戏中也可以可以经常看见使用高斯模糊的技术:
(《赛达尔传说:荒野之息》中对游戏背景使用高斯模糊,就将我们的主角们与背景分离出来,形成了前景、背景两个层面)
这节我们就来学习下如何使用DirectX11的计算着色器来实现高斯模糊。
一、计算着色器(Compute Shader)
如下图所示,计算着色器不属于渲染管线的一部分,但是计算着色器可以读写渲染管线。
计算着色器的计算能力和处理器数量有关,比如如果你的GPU有16个多处理器,那么就可以开启16个线程组。每个线程组,可以有n个线程。NVIDIA显卡基于SIMD32,n必须是一个warp(即32)的倍数。而ATI显卡是基于一个wavefront(即64)的倍数。一个线程组可以互相共享内存,而且等待每个线程同步,但是不同线程组是没有该能力的。
二、高斯模糊计算原理
可以这样通俗地描述,高斯模糊就是对每个像素点综合周围的像素点进行混合,最终产生模糊的像素点。
例如对于某个点pij会有如下图综合周围像素点的计算。而且需要一个权重矩阵(Weight Matrix),该矩阵对应着其周围像素的颜色贡献比例(而且所有权加起来必须等于1,大于1会过亮,小于1会过暗)。
对于高斯模糊的算法,我们可以用这样一个严谨的数学形式来描述它(说白了,其实就是我上面说的那段话,不需要害怕数学公式):
好了,有了这样一个基本的高斯模糊思路之后,后面的内容就是主要围绕着如何实现这个算法。
那周围的像素和自身的像素应该如何贡献呢?我们可以自己想想,应该自身的像素贡献最大(否则模糊后连基本的轮廓都认不出来),因此就需要引入一个高斯分布函数(其实就是高中学的正态分布函数)来计算权值:
(正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。)
有没有发现上面的高斯分布函数是一维的?但是我们的图像是二维的,权重矩阵也是二维