学习Metal:后处理
离屏渲染
在之前的例子中,图像的内容是直接渲染到屏幕上,也就是我们画了什么内容,在屏幕上立即就显示出来了,这种模式称之为当前屏幕渲染(on-screen rendering)。但是有些情况下,我们希望对图像的内容做一些后处理,然后在显示出来,这就需要用到离屏渲染了(off-screen rendering)。
所以离屏渲染实际上就是把我们需要显示的内容渲染到另外的内存中,而不是直接上屏。在OpenGL中用到的是帧缓冲(FBO)的概念,而在metal中我们只需要把MTLRenderPassDescriptor中的texture设置成我们自己定义的texture即可。在设置好后,渲染的内容自动在我们定义的这个texture中,这样这个texture的内容就可以作为下一步渲染的输入。我们可以访问渲染后内容的每一个像素值,然后就可以对渲染后的场景进行我们自己的处理,所以我们称这种操作为后处理(Post-Processing)。
简单的锐化处理
我们可以对一副图像做一个简单的锐化处理,它的原理是取样一个像素点的值以及它周围上下左右四个点的值。例如分别取样的值为color, color_t, color_b, color_l, color_r,然后通过如下的处理作为返回值,实际上就完成了一个最简单的锐化的处理。
5*color - (color_t + color_b + color_l + color_r)
以上公式对于边缘的部分,也就是和周围像素相比,差值比较大的点,处理后的结果会使得差值更大。但是对于平坦的区域,也就是和周围像素的差值很小的点,处理后的结果会基本保持和原图一直。
Metal后处理实例
还是利用之前的例子,只不过我们这次是进行两边的处理,第一遍先把一副图像渲染到一个纹理中,然后在对这个纹理进行取样,做锐化处理。
初始化
由于这次我们是有两次渲染,所以我们需要有两个MTLRenderPipelineState对象,来分别表示两次渲染的过程。同时需要一个MTLTexture来存储第一次渲染的结果,也就是离屏渲染的目标纹理。同时为了确定锐化后处理中,采样周围元素所需要的步长