屏幕后处理特效
最近看了看Unity一种专门的Shader类别,Image Effect,一般有两种:GrabPass和Post-Processing
GrabPass
用来抓取物体所在屏幕位置的渲染图像,然后把这张Texture传递给接下来的Pass进行图像处理。它也是写在SubShader中的,使用时可以采用默认方式或者指定方式:
1 | GrabPass {“TextureName”} |
需要注意的是,当我们抓取好grabPos后,使用这个纹理坐标对抓取的图像进行采样时,要使用tex2Dproj函数,它是将坐标从正交投影转换为透视投影,返回一个0~1的值。
Post-Processing
后处理效果本质就是对要显示在屏幕前面的那个四边形面片进行处理,相当于把经过了渲染管线之后的照片拿到ps里面做最后的处理。实现后处理需要C#与shader共同作用,这个C#脚本需要把摄像机的RenderImage以RenderTexture的方式传递给关联Shader,shader处理完之后再传回脚本。
这个机制在Unity中是使用OnRenderImage实现的,它的source参数是摄像机渲染完的那个texture,destination是经过shader处理之后将要输出到屏幕上的texture。整个流程大概是:摄像机在这一帧渲染好的暂时储存在source中,然后显卡调用shader对它进行处理,处理完成之后的图像通过Graphics.Blit(source,destination,material,-1)转移到destination,等待输出到屏幕。source则会继续接收下一帧摄像机渲染好的图像。最后一个参数默认-1,会依次调用各个pass,如果指定了具体的数字,那就会调用对应的pass。
在shader中,_MainTex是一个固定的名字,用于接收摄像机的RenderTexture,不能改变它。而且在pass中为了避免对场景中的物体产生影响,要关闭几何体剔除和深度写入(避免挡住后面要渲染的物体),并且深度测试必须总是通过。
后处理标配的状态标志:
1 | Cull Off |