找回密码
 立即注册
查看: 296|回复: 0

Unity渲染绘制接口(五)CommandBuffer

[复制链接]
发表于 2022-3-1 11:14 | 显示全部楼层 |阅读模式
六、CommandBuffer

CommandBuffer保存渲染指令,并在特定渲染阶段(与渲染路径相关)执行。渲染指令与之前介绍的渲染接口类似,特定的渲染阶段与Camera处理流程相关。
6.1 渲染路径与Camera事件

上一章节中提到了两种渲染路径的原理。此处给出详细的Camera渲染流程:




总体来说,两种渲染路径都是按照先渲染不透明对象(由近及远,天空盒最后),再渲染透明对象。延迟渲染路径中,对于无法支持的渲染对象会使用前向渲染方式处理。
6.2 关键API

CommandBuffer接口与Graphics有很多作用类似的接口,此章节会略过这一部分,如有需要参考。
CommandBuffer


    • SetRenderTarget:将Shader属性对应的RT设置为绘制对象
    • SetGlobalTexture:设置全局Shader纹理变量,与Shader.SetGlobalTexture作用类似
    • GetTemporaryRT:获取RT并与Shader属性绑定
    • ReleaseTemporaryRT:释放Shader属性对应的RT

Camera


    • AddCommandBuffer:为Camera添加CommandBuffer
    • RemoveCommandBuffer:为Camera移除CommandBuffer

BuiltinRenderTextureType


    • CurrentActive:当前active纹理
    • CameraTarget:Camera绘制的纹理
    • Depth:深度纹理
    • GBuffer0:(延迟渲染)颜色纹理
    • GBuffer2:(延迟渲染)normals纹理

// 拷贝屏幕纹理到Shader属性
int screenCopyID = Shader.PropertyToID("_ScreenCopyTexture");
buf.GetTemporaryRT(screenCopyID, -1, -1, 0, FilterMode.Bilinear);
buf.Blit(BuiltinRenderTextureType.CurrentActive, screenCopyID);
踩坑Tips
CommandBuffer.GetTemporaryRT获取的RT会在Graphics.ExecuteCommandBuffer或者CameraEvent渲染完成后被回收,这就可能导致在不同CameraEvent获取RT时,取得之前创建的RT,覆盖原有的效果。如果是持续化显示,通过RenderTexture.GetTemporary接口可以避免这类问题。
CameraEvent.AfterImageEffects获取的屏幕纹理是翻转的,具体原因不清,知道的大佬告知一下。
6.3 Demo

测试内容:场景中存在不透明和半透明两种小球,两类小球渲染完成时分别进行截图。截图时并绘制一个Cube,两通道输出到两张RT上。传送门RanderAPI场景:


七、总结

从渲染组件、渲染接口以及渲染流程三个方面,基本理清了Unity底层渲染逻辑以及拓展方式。在Unity 2018之后提供了SRP,对管线的修改给出了更便捷的处理方式,之后会学习这部分内容。补充阅读麦老师的手动渲染管线,对渲染管线会有更好得认识
参考


  • Unity - Scripting API: CommandBuffer
  • 使用 CommandBuffer 来扩展内置渲染管线 - Unity 手册
  • https://blog.unity.com/technology/extending-unity-5-rendering-pipeline-command-buffers

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-17 00:44 , Processed in 0.091882 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表