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()?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容