什么是CommandBuffer?
上一篇讲了Unity中的RenderTexture,提到了FrameBuffer,unity中可以通过FrameDebugger来查看FrameBuffer的内容,CommandBuffer通过字面意思 就是一条命令 ,unity提供给开发者的一个自定义的渲染命令,依赖相机,用来拓展渲染管线的渲染效果,我们可以根据参数指定CommandBuffer在绿色的点上添加执行命令:
unity中调用的枚举是:
CommandBuffer的使用:
新建一个cube,使用不透明的红色的材质球,命名为RedCube,添加TestCommand.cs,拖进去绿色的材质球GreenMat,和RedCube:
Camera调用AddCommandBuffer来把指定的指令塞到自己的渲染步骤中,需要注意多Camera下CommandBuffer的绑定.
未运行状态:
运行游戏,可以看到RedCube是红色的,背景是黑色的
打开FrameDebuger可以看到,根据CameraEvent的设置,插入的commandBuffer设置在BeforeForwardOpaque,所以绿色渲染完被clear成黑色,然后红色cube最后渲染,
如果CameraEvent设置为AfterForwardOpaque,Clear操作放在渲染green之前
画面为,先渲染了红色cube,然后调用了Clear变成了黑色,最后渲染了green.
FrameDebugger画面
可以看出来Clear操作被提前了,CommandBuffer的指令也被延后了.
CommandBuffer默认修改了默认的RenderTexture(也就是game窗口),如果调用CommandBuffer.SetRenderTarget().它就会把渲染内容附在那个RT上,而不会对Game窗口的渲染内容有任何影响.可以通过以下方式修改到game窗口:
可以看出来CommandBuffer这个东西自由度很高,根据CameraEvent ,它可以穿插在任意步骤之中,如果插在everything之后,它还能用作屏幕后处理.看到这大概可以猜到 CommandBuffer其实对应的是OpenGL中的Push Buffer,可以理解成Unity使用PushBuffer构成了固定渲染管线,同时封装了CommandBuffer供开发者自定义一些渲染指令. 另外,Unity2019.3中,自定义渲染管线SRP已经脱离预览版,其实就是允许开发者使用CommandBuffer自己构建一套渲染管线.
总结CommandBuffer的用法,就是三个词:
when:何时绘制? 由CameraEvent决定渲染时机.
how :如何绘制? cb.DrawRenderer() cb.DrawMesh() cb.Blit() 不同的API绘制的内容也不同,再传入指定的材质球,指定的RT即可
where:在哪里绘制? 以上演示的都是在默认的Transform绘制,如果想在别的地方绘制,调用Matrix4x4.SetTRS()