Unity中的CommandBuffer

上一篇讲了Unity中的RenderTexture,提到了FrameBuffer,unity中可以通过FrameDebugger来查看FrameBuffer的内容,CommandBuffer通过字面意思 就是一条命令 ,unity提供给开发者的一个自定义的渲染命令,依赖相机,用来拓展渲染管线的渲染效果,我们可以根据参数指定CommandBuffer在绿色的点上添加执行命令:

Unity中的CommandBuffer_第1张图片

unity中调用的枚举是:

Unity中的CommandBuffer_第2张图片

CommandBuffer的使用:

新建一个cube,使用不透明的红色的材质球,命名为RedCube,添加TestCommand.cs,拖进去绿色的材质球GreenMat,和RedCube:

Unity中的CommandBuffer_第3张图片

Camera调用AddCommandBuffer来把指定的指令塞到自己的渲染步骤中,需要注意多Camera下CommandBuffer的绑定.

未运行状态:

Unity中的CommandBuffer_第4张图片

运行游戏,可以看到RedCube是红色的,背景是黑色的

Unity中的CommandBuffer_第5张图片

 

打开FrameDebuger可以看到,根据CameraEvent的设置,插入的commandBuffer设置在BeforeForwardOpaque,所以绿色渲染完被clear成黑色,然后红色cube最后渲染,

Unity中的CommandBuffer_第6张图片

如果CameraEvent设置为AfterForwardOpaque,Clear操作放在渲染green之前

Unity中的CommandBuffer_第7张图片

画面为,先渲染了红色cube,然后调用了Clear变成了黑色,最后渲染了green.

Unity中的CommandBuffer_第8张图片

FrameDebugger画面

Unity中的CommandBuffer_第9张图片

可以看出来Clear操作被提前了,CommandBuffer的指令也被延后了. 

CommandBuffer默认修改了默认的RenderTexture(也就是game窗口),如果调用CommandBuffer.SetRenderTarget().它就会把渲染内容附在那个RT上,而不会对Game窗口的渲染内容有任何影响.可以通过以下方式修改到game窗口:

 

Unity中的CommandBuffer_第10张图片

可以看出来CommandBuffer这个东西自由度很高,根据CameraEvent ,它可以穿插在任意步骤之中,如果插在everything之后,它还能用作屏幕后处理.看到这大概可以猜到 CommandBuffer其实对应的是OpenGL中的Push Buffer,可以理解成Unity使用PushBuffer构成了固定渲染管线,同时封装了CommandBuffer供开发者自定义一些渲染指令. 另外,Unity2019.3中,自定义渲染管线SRP已经脱离预览版,其实就是允许开发者使用CommandBuffer自己构建一套渲染管线.

你可能感兴趣的:(unity)