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