从本章开始,我们要正式进入可编程渲染管线的学习和设计了。在这一节,我们会讲解以下内容:
Unity 可编程渲染管线的基础代码结构
Command Buffer
Render Texture和Render Target
相机和渲染目标的关系
本小节包含以下案例:Kata 1:蓝屏!
1.2.1 初始Unity可编程渲染管线
在之前的小节中,我们介绍了渲染管线的基本概念,以及可编程管线的优势所在。但是我们并没有告诉读者到底怎么对渲染管线进行编程。事实上,如果没有Unity这种封装好的API可供调用的话,编写渲染管线需要学习相当多的图形API知识,比如目前流行的Direct3D 11,以及未来的Direct3D 12和Vulkan。而Unity帮我们做好了大量的封装工作,因此我们只需要自己实现一个函数:Render(),就可以使用实现自己的渲染管线了,简单吧!
虽然如此,但是如果读者有精力去学习底层的图形API的话,对渲染管线的编程是有很大的帮助的。毕竟所有的图形绘制最终都会转化成对底层API的调用,如果读者能够从实现角度理解渲染管线的话,在性能达到瓶颈的时候也容易了解应该从哪里入手进行优化。
在Unity中,我们使用一个RenderPipeline来代表自己的渲染管线,并使用RenderPipeline.Render方法来代表绘制一帧的操作。一旦我们将自己的RenderPipeline对象注册到Unity中,Unity就会每一帧都调用我们自己的RenderPipeline来绘制整个画面。
接下来让我们用一个案例来搭建我们最初的渲染管线架构吧!
Kata 1:蓝屏!
蓝屏不仅是Windows用户的噩梦,也是我们渲染管线之旅的开始(笑)。蓝屏的管线只干了一件事:将屏幕清空成蓝色。但是为了让管线正常运转起来,我们必须要设置完所有的内容。这个有点像Hello World的程序可以在之后用于测试Unity是否支持我们的管线。
目标:搭建渲染管线,将屏幕清空为蓝色。
在Unity中新建两个脚本文件,命名为Kata01.cs和Kata01Asset.cs,输入以下内容:
Kata01.cs:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
namespace Kata01
{
public class CustomRenderPipeline : RenderPipeline
{
CommandBuffer _cb;
//这个函数在管线被销毁的时候调用。 public override void Dispose()
{
base.Dispose();
if(_cb != null)
{
_cb.Dispose();
_cb = null;
}
}
//这个函数在需要绘制管线的时候调用。 public overr