MEGALOVANIA MEGALOVANIA

游戏开发中

目录
UnitySrp自定义渲染管线 第一章笔记
/    

UnitySrp自定义渲染管线 第一章笔记

基础

  • 结构:RenderPiplineAsset
  • 结构:RenderPipline
  • 上一行的是由上上行的东西创建出来的,然后 Asset 创建出一个 Asset 实例,用给具体的 Quality 设置
  • 基础概念,context camera
  • 自定义一个 CameraRender 结构,因为默认的 Render 可能是多个相机的

天空盒渲染与剔除

  • content.DrawSkybox,但是这个只是缓存,提交需要 content.submit
  • CommandBuffer 是一个常用的渲染接口,大概顺序如下
    • 先 executeCommandBuffer
    • 然后 Clear,因为上一步并不会清除缓存区
  • 一般的 executebuffer 都是先 execute 然后 clear
  • 渲染之前 buffer 要清除 renderTarget
  • 剔除的相关函数,返回的结果是一个结构体
  • image.png

编辑器:不支持的 Shader 渲染

  • 然后接下来应该对剔除结构之后的所有 renderer 进行一手渲染,需要注意一下几个问题:

    • 渲染的内容,也就是设置哪个 shader 的哪个 pass 里渲染。一般我们取一个 shaderId 传进去。
    • 渲染顺序。
    • 设置哪些渲染队列的可以被渲染
  • 正常来说正确的渲染顺序:不透明物体-> 天空盒-> 绘制透明物体

  • 组合一下,大概是这样:

  • image.png

  • 编辑器部分

  • 绘制不支持的颜色列表,也同样的,基本是传进来 shaderId

  • 遍历一下 ShaderId,然后如同上面一样绘制即可

  • 另外可以顶一个 staticMaterial,其实默认的编译 shader 的那个粉色的颜色是一个固定的 Shader,叫做 Hidden/InternalErrorShader

  • 渲染设置可以重载所渲染的 Shaderimage.png

编辑器:动静分离

  • 其实就是用 partical 关键字把一些只有 Editor 内容放到另一个类里面了。

编辑器:UI 绘制

  • UI 的绘制
  • UI 的绘制并不是我们自己绘制的,而是一个单独的绘制命令,直接加一个 overlay 的 UI 会导致 Game 里面绘制了,但是 Editor 里面并没有绘制
  • 解决办法是剔除之前,调用一个方法来通知 UI 发送带 Scene 视图里绘制
  • image.png

编辑器:多摄像机

  • 为了区分,抽一个结构出来,把 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