Unity中的CommandBuffer

什么是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() 

你可能感兴趣的:(Unity中的CommandBuffer)