Loading... #### 1. `OnRenderImage`不能用了,需要用RenderFeature自定义Pass,或者使用[BeginCameraRendering](https://docs.unity3d.com/ScriptReference/Rendering.RenderPipeline.BeginCameraRendering.html) #### 2. 这里只分享使用RenderFeature的方式实现后处理,该方式在[在URP中实现高度雾和远景雾](https://www.lazyun.cn/Unity/37.html)中有使用过。 - class [CustomPostProcessRenderFeature](https://github.com/LazyunGame/CustomPostProcessForURP/blob/master/CustomPostProcessRenderFeature.cs) 作为一个`ScriptableObject`, 其中保存记录该后处理需要的一些参数 - a. `RenderPassEvent` 是该后处理Pass执行的时机,一般选择AfterRenderingSkyBox - b. `Enable Camera Parameter` 用来开关是否将Camera的矩阵参数等传入Shader,具体缘由见下文中的说明。 - c. `Shader` 该后处理需要使用的Shader - class [PostProcessPass](https://github.com/LazyunGame/CustomPostProcessForURP/blob/master/PostProcessPass.cs) 具体实现后处理的Pass,核心代码: ``` cmd.SetViewProjectionMatrices(Matrix4x4.identity, Matrix4x4.identity); cmd.SetViewport(camera.pixelRect); cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, m_BlitMaterial); cmd.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix); ``` 该方式是重置`ViewMatrix` 和 `ProjectionMatrix`之后,直接使用CommandBuffer.DrawMesh API 来绘制一个全屏Mesh,绘制过程就是使用上文提到的Shader,所以该Shader运行环境的`ViewMatrix`和 `ProjectionMatrix` 就不是Camera的矩阵。 为了能正常计算重构世界坐标,所以需要额外将Camera相关的矩阵作为参数传入。 ![使用传入的Camera矩阵计算得到的Far Plane坐标](https://res.lazyun.cn/typecho/2022/05/21/persp_far.jpg?x-oss-process=style/compress) 最后修改:2022 年 05 月 22 日 © 禁止转载 赞 0