【译】扩展UNITY5的渲染管线:指令缓冲
原文地址:http://blogs.unity3d.com/2015/02/06/extending-unity-5-rendering-pipeline-command-buffers/
原文作者未做版权声明,视为共享知识产权进入公共领域,自动获得授权
在Unity5里,我们添加了许多用户可见的图形功能(新的标准材质、实时全局光照、反射探头、新的光照贴图工作流等等),我们同样也对内部架构进行了调整。除了一些经典的事情,比如优化(多线程光照裁剪)和让表现更加一致(在线性和Gamma颜色空间中表现更一致),我们还想办法让它变得更加灵活。
在测试组内部我们讨论了很多方法。这些想法包括:更多的脚本回调、装配小功能的缓冲区、可以从头创建的完整渲染管线、某种树/图渲染流水线建造工具等等。对于Unity 5,我们赋予了创建“一些事情要做“的缓冲区,我们把它称为指令缓冲区。
图形的指令缓冲区是一系列要执行的底层指令。比如,像Direct3D和OpenGL 3 d渲染api通常最终构建一个命令缓冲区,然后由GPU执行。Unity的多线程渲染器也在调用线程和工作线程之间构建了一个指令缓冲区,工作线程会往里面填充对渲染API的调用。
这些想法是很相似的,但是在我们的例子中,“指令“更高层。不是诸如”设置GPU的寄存器X的值为Y“,而是”用那种材质绘制这个Mesh”这样的。
你可以在你的脚本里创建指令Buff并往里面添加渲染指令(设置渲染目标,绘制三角形网格)。然后这些指令可以在相机渲染的几个时刻进行渲染。
比如说,你可以在正常物体处理完以后再把一些额外物体的信息会知道延迟渲染的G-buffer上。或者在天空盒被绘制后立刻绘制一些云,但是在其他事情之前。或者在常规光源处理完毕以后把一些自定义光绘制到延迟渲染的Lightbuffer上等等,我们相信会有一些列有趣的用途。
具体信息可以看脚本API文档的CommandBuffer 和 CameraEvent页。
要么给图,要么别说话!
好吧,我们可以做一个模糊的反射。
在不透明物体和天空盒绘制完成以后,当前的图像被拷贝到一个临时的渲染对象中,模糊并且设置全局的shader属性。绘制光滑的物体然后用模糊的图片采样,把UV坐标用一个法线贴图来校正模拟反射。这很像shader GrabPass does ,除了你要做更多定制的事情(在这个例子中,是模糊)。
下一个列子是自定义的延迟光照。以下是球形灯和管状灯:
在常规的延迟光照Pass完成后,给每个定制光源画一个球,并计算光照度并更新光照buffer。
另外一个例子:延迟贴花。
这个想法是在GBuffer绘制完毕以后,画出每个形状的贴纸,然后修改GBuffer的内容。这跟延迟渲染处理光的做法很像,除了不是在G-buffer累加光照度以外。
每个贴花用了一个盒子来实现,并且影响到盒子内部的几何信息。
事实上,我们有一个小的Unity工程来说明上述的内容:RenderingCommandBuffers50b22.zip.
你可以看到上面的例子都不是很复杂-脚本只有几百行代码。
我觉得这个已经足够激动人心了,我已经等不及去看到你会用它来做什么!