大致原理是通过三个pass实现
第一个pass(DrawOpaqueObjects):渲染场景物体
第二个pass(CopyColor):将场景物体拷贝到RenderTarget
第三个pass(Render Glitch Objects):使用RenderObject重新绘制指定场景物体,传入RenderTarget,将RenderTarget映射到RenderObject物体的顶点UV,然后进行噪音扭曲
一、RenderFeature
GlitchEffect主要通过RenderObject实现效果
这里需要注意的是Event为BeforeRenderingTransparent。为什么Event要选BeforeRenderingTransparent?
可以通过FrameDebugger看到Render Glitch Objects这个pass往shader中传入了一张_CameraOpaqueTexture,而这张_CameraOpaqueTexture是通过上一个CopyColor Pass传过来的。CopyColor Pass的作用是在DrawOpaqueObject Pass之后把渲染出来的东西拷贝到_CameraOpaqueTexture。如果把RenderFeature的Event提前,那拿到的_CameraOpaqueTexture将会是错误的,因为CopyColor还没执行。
CopyColor Pass需要通过PipelineAsset的OpaqueTexture选项开启
二、Shader
1.SceneColor节点
_CameraOpaqueTextur是传给Glitch_Graph的SceneColor节点使用的。SceneColor节点的作用就是获取当前屏幕渲染的RenderTexture。可以通过创建一个简单的shader验证效果
用这个shader创建一个材质并付给一个球体,可以看到相机RenderTarget贴到了球面上
2.ScreenPosition节点
ScreenPosition的作用是获取当前顶点在屏幕空间的UV,可以通过创建一个简单的shader看到效果(需要设置Transparent)
用这个shader创建一个材质,赋给场景的一个球体,调整材质的参数offset,可以看到RenderTarget在球体上进行了偏移
3.Noise
SimpleNoise节点主要是对X轴进行噪音扰动
Remap节点主要是让扰动方向映射到-1到1之间,这样扰动方向向左向右就都有了