项目中我使用的方法,自己记录下。 1》扭曲效果本身实现 方向使用渲染物体的法线来标记,渲染完其他物体后,最后渲染扭曲,将一张渲染完成后的rt传入shader中,根据渲染物体的屏幕坐标渲染根据法线偏移过后的像素,达到扭曲效果。 当然这个方法可以使用两个相机来实现,考虑到项目中经常要对相机做复制,双层相机复制的步骤繁琐且不好管理。而且双相机的性能也有一定的损耗。 最后采用CommandBuffer来实现。我们手动渲染扭曲物体。 2》实现流程 先管理一个list用来记录扭曲物体,同时这些扭曲物体不会被任何相机渲染,主要用来提供renderer和material。供给CommandBuffer.DrawRenderer使用。 项目使用前向渲染,我们需要在透明物体渲染结束之前渲染扭曲物体即可。 Camera.AddCommandBuffer(CameraEvent.AfterForwardAlpha, _distortionCommand); 在渲染物体之前,需要把当前绘制的rt拷贝出来,以供扭曲物体使用。 _distortionCommand.Blit(BuiltinRenderTextureType.CameraTarget, distortionRT); 接着传入Shader _distortionCommand.SetGlobalTexture(PARAM_SCENE_COPY, distortionRT); 设置回来 _distortionCommand.SetRenderTarget(BuiltinRenderTextureType.CameraTarget); 接下来手动渲染之前就收集好的扭曲物体 _distortionCommand.DrawRenderer(GameGraphics.Instance.distortionObjList[i].rendererDis, GameGraphics.Instance.distortionObjList[i].materialDis); 搞定,记得rt复用减少gc节省内存。