基础
- 结构:RenderPiplineAsset
- 结构:RenderPipline
- 上一行的是由上上行的东西创建出来的,然后 Asset 创建出一个 Asset 实例,用给具体的 Quality 设置
- 基础概念,context camera
- 自定义一个 CameraRender 结构,因为默认的 Render 可能是多个相机的
天空盒渲染与剔除
- content.DrawSkybox,但是这个只是缓存,提交需要 content.submit
- CommandBuffer 是一个常用的渲染接口,大概顺序如下
- 先 executeCommandBuffer
- 然后 Clear,因为上一步并不会清除缓存区
- 一般的 executebuffer 都是先 execute 然后 clear
- 渲染之前 buffer 要清除 renderTarget
- 剔除的相关函数,返回的结果是一个结构体
编辑器:不支持的 Shader 渲染
-
然后接下来应该对剔除结构之后的所有 renderer 进行一手渲染,需要注意一下几个问题:
- 渲染的内容,也就是设置哪个 shader 的哪个 pass 里渲染。一般我们取一个 shaderId 传进去。
- 渲染顺序。
- 设置哪些渲染队列的可以被渲染
-
正常来说正确的渲染顺序:不透明物体-> 天空盒-> 绘制透明物体
-
组合一下,大概是这样:
-
-
编辑器部分
-
绘制不支持的颜色列表,也同样的,基本是传进来 shaderId
-
遍历一下 ShaderId,然后如同上面一样绘制即可
-
另外可以顶一个 staticMaterial,其实默认的编译 shader 的那个粉色的颜色是一个固定的 Shader,叫做 Hidden/InternalErrorShader
-
渲染设置可以重载所渲染的 Shader
编辑器:动静分离
- 其实就是用 partical 关键字把一些只有 Editor 内容放到另一个类里面了。
编辑器:UI 绘制
- UI 的绘制
- UI 的绘制并不是我们自己绘制的,而是一个单独的绘制命令,直接加一个 overlay 的 UI 会导致 Game 里面绘制了,但是 Editor 里面并没有绘制
- 解决办法是剔除之前,调用一个方法来通知 UI 发送带 Scene 视图里绘制
编辑器:多摄像机
-
为了区分,抽一个结构出来,把 buffer 的 SampleName 定义成摄像机的名字,把他传进去即可
-
多个摄像机有的问题是,如果渲染的 Layer 不一样,按照我们默认清除的手段,第二个摄像机会直接把之前的帧缓冲清除掉。为了解决这个问题,需要修改 bufferClearTarget 的参数
-
cameraClearFlag 由小到大依次是:Skybox,Color,Depth,Nothing.前三个都是会清除深度缓冲区的。这个的值越小,清除的东西越多。
-
再说回来 Buffer 的 ClearTarget。看下他的参数
- 第一个参数表示是否清除 depth。这个判断下只要 camera 的 clearTag 小于等于 Depth 就清除。
- 第二个参数代表是否清除 color。我们要设置为只有 flag==color 的时候才清除。
- 第三个参数表示用来清除的颜色。判断下如果是 color 的 cleartag,就直接使用相机额 backgroundcolor,注意要转换成线性色彩空间。如果不是,直接用 Color.CLEAR 即可
-
做完上面的东西,我们可以把第一个相机设置为 clear Color 或者是是 skybox,第二个设置为 DepthOnly 或者是 NoClear。前面的设置是需不需要第一个渲染天空盒子,后面的设置是看需不需要用第一个的深度缓冲区。
标题:UnitySrp自定义渲染管线 第一章笔记
作者:matengli110
地址:https://www.sunsgo.world/articles/2022/01/23/1642909024191.html