Unity中Command Buffers的作用
Command Buffer简介
首先附加官方文档介绍:Command Buffer简介
Command Buffer 是一个保存渲染命令的缓冲区(内存块),我们可以使用它对渲染管线进行扩展,在渲染管线指定的某几个阶段插入这个渲染命令,以达到想要的效果。Command Buffer可以实现多种后效及特效,常用于对某个模型做二次渲染。
Command Buffer可以插入到渲染管线的以下节点位置:
以上节点可从Camera Event和Light Event获取:
CameraEvent和LightEvent
CameraEvent和LightEvent用于指定Command Buffer 插入的位置,分别对应camera和light:
CameraEvent
Properties
BeforeDepthTexture | Before camera's depth texture is generated. |
AfterDepthTexture | After camera's depth texture is generated. |
BeforeDepthNormalsTexture | Before camera's depth+normals texture is generated. |
AfterDepthNormalsTexture | After camera's depth+normals texture is generated. |
BeforeGBuffer | Before deferred rendering G-buffer is rendered. |
AfterGBuffer | After deferred rendering G-buffer is rendered. |
BeforeLighting | Before lighting pass in deferred rendering. |
AfterLighting | After lighting pass in deferred rendering. |
BeforeFinalPass | Before final geometry pass in deferred lighting. |
AfterFinalPass | After final geometry pass in deferred lighting. |
BeforeForwardOpaque | Before opaque objects in forward rendering. |
AfterForwardOpaque | After opaque objects in forward rendering. |
BeforeImageEffectsOpaque | Before image effects that happen between opaque & transparent objects. |
AfterImageEffectsOpaque | After image effects that happen between opaque & transparent objects. |
BeforeSkybox | Before skybox is drawn. |
AfterSkybox | After skybox is drawn. |
BeforeForwardAlpha | Before transparent objects in forward rendering. |
AfterForwardAlpha | After transparent objects in forward rendering. |
BeforeImageEffects | Before image effects. |
AfterImageEffects | After image effects. |
AfterEverything | After camera has done rendering everything. |
BeforeReflections | Before reflections pass in deferred rendering. |
AfterReflections | After reflections pass in deferred rendering. |
BeforeHaloAndLensFlares | Before halo and lens flares. |
AfterHaloAndLensFlares | After halo and lens flares. |
LightEvent
BeforeShadowMap | Before shadowmap is rendered. |
AfterShadowMap | After shadowmap is rendered. |
BeforeScreenspaceMask | Before directional light screenspace shadow mask is computed. |
AfterScreenspaceMask | After directional light screenspace shadow mask is computed. |
BeforeShadowMapPass | Before shadowmap pass is rendered. |
AfterShadowMapPass | After shadowmap pass is rendered. |
测试程序
public Camera m_camera;
public void AddCommandBuffer(CommandBuffer commandBuffer)
{
//m_camera.RemoveCommandBuffer(CameraEvent.BeforeImageEffectsOpaque, commandBuffer); // 以防万一
m_camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque,commandBuffer);
}
public Shader shader;
void start()
{
CommandBuffer buffer = new CommandBuffer();
//设置自己的渲染,使用该shader在渲染不透明物体之前,再渲染一次物体本身
buffer.DrawRenderer(GetComponent<Renderer>(), new Material(shader));
AddCommandBuffer(buffer);
}