你好,我是月影。
前面几节课,我们学习了利用向量和矩阵公式,来处理像素和生成纹理的技巧,但是这些技巧都有一定的局限性:每个像素是彼此独立的,不能共享信息。
为什么这么说呢?因为 GPU 是并行渲染的,所以在着色器的执行中,每个像素的着色都是同时进行的。这样一来,我们就不能获得某一个像素坐标周围坐标点的颜色信息,也不能获得要渲染图像的全局信息。
这会导致什么问题呢?如果我们要实现与周围像素点联动的效果,比如给生成的纹理添加平滑效果滤镜,就不能直接通过着色器的运算来实现了。
因此,在 WebGL 中,像这样不能直接通过着色器运算来实现的效果,我们需要使用其他的办法来实现,其中一种办法就是使用后期处理通道。所谓后期处理通道,是指将渲染出来的图像作为纹理输入给新着色器处理,是一种二次加工的手段。这么一来,虽然我们不能从当前渲染中获取周围的像素信息,却可以从纹理中获取任意 uv 坐标下的像素信息,也就相当于可以获取任意位置的像素信息了。
使用后期处理通道的一般过程是,我们先正常地将数据送入缓冲区,然后执行 WebGLProgram。只不过,在执行了 WebGLProgram 之后,我们要将输出的结果再作为纹理,送入另一个 WebGLProgram 进行处理,这个过程可以进行一次,也可以循环多次。最后,经过两次 WebGLProgram 处理之后,我们再输出结果。