创建渲染管线资源和渲染管线实例
如果你正在创建你自己的可编程渲染管线(SRP),你的工程必须包含以下:
-
一个继承自RenderPipelineAsset的脚本,并且还需要重新里边的CreatePipeline()方法,这个脚本定义了你的渲染管线资源
-
一个继承自 RenderPipeline的脚本,同时还需要重写 Render()方法, 这个脚本定义了你的渲染管线实例
-
你从 RenderPipelineAsset 脚本创建的渲染管线资源. 这个资源的行为可以看作是渲染管线实例的工厂类
因为这些元素之间的联系是很紧密的,所以你应该在同一时间创建它们
创建一个基本的渲染管线资源和渲染管线实例
下边的实例展示了如何创建脚本去定义渲染管线实例以及渲染管线资源本身,这包括了用基本的自定义渲染管线资源去实例化渲染管线实例
1.创建一个名称为:ExampleRenderPipelineAsset.cs的C#脚本
2.复制和粘贴以下代码到你新创建的脚本中:
using UnityEngine;
using UnityEngine.Rendering;
// The CreateAssetMenu attribute 可以让你在Unity编辑器中创建这个类的实例
[CreateAssetMenu(menuName = "Rendering/ExampleRenderPipelineAsset")]
public class ExampleRenderPipelineAsset : RenderPipelineAsset
{
// unity会在渲染第一帧的时候调用这个方法
//如果渲染管线资源的设置改变了,unity会销毁当前渲染管线实例,
//并且会在下一帧渲染之前再次调用这个方法
protected override RenderPipeline CreatePipeline() {
//实例化这个自定义SRP用于渲染而使用的渲染管线
return new ExampleRenderPipelineInstance();
}
}
3.创建一个名称为ExampleRenderPipelineInstance.cs的C#脚本
4.复制和粘贴以下代码到你新创建的脚本中:
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipelineInstance : RenderPipeline
{
public ExampleRenderPipelineInstance() {
}
//unity在当前渲染画面中为每个不同类型的摄像机每一帧调用这个方法一次
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
//这里是你可以编写自定义渲染代码的地方,自定义这个方法从而自定义你的SRP
}
}
5.在Project视图中,你要么点击加号(+)按钮,要么打开相关联的菜单按钮,然后找到Create按钮,接着选择Rendering->Example Render Pipeline Asset.然后unity会在Project试图下生成一个新的渲染管线资源
创建可配置的渲染管线资源和渲染管线实例
默认情况下,渲染管线资源是存储渲染管线实例用于渲染的信息,以及存储默认的材质和shader在编辑器中所使用的数据.在你的RenderPipelineAsset脚本中,你可以扩展你的渲染管线资源,用其来存储额外的数据,你也可以在你的工程中拥有多个配置不同的渲染管线资源.比如说,你可以使用渲染管线资源为每个不同的硬件层保存配置数据.高清晰渲染管线(HDRP)和通用渲染管线(URP)都包含在这里的实例中.
以下的实例展示了如何创建一个用于定义渲染管线资源的RenderPipelineAsset脚本,并且脚本中含有你可以在Inspector面板中为每个实例设置的公有数据.渲染管线实例在其构造函数中接收渲染管线资源并且使用该管线资源中的数据
1.创建一个名称为ExampleRenderPipelineAsset.cs的脚本
2.复制和粘贴以下代码到你新创建的脚本中:
using UnityEngine;
using UnityEngine.Rendering;
// The CreateAssetMenu attribute 可以让你在unity编辑器中创建这个类的实例
[CreateAssetMenu(menuName = "Rendering/ExampleRenderPipelineAsset")]
public class ExampleRenderPipelineAsset : RenderPipelineAsset
{
//为每一个渲染管线资源在Inspector面板中定义的数据
public Color exampleColor;
public string exampleString;
//unity会在渲染第一帧之前调用这个方法
//如果渲染管线资源的设置改变了,unity会销毁当前渲染管线实例,并且会在下一帧之前再次调用这个方法
protected override RenderPipeline CreatePipeline() {
//实例化这个自定义SRP用于渲染的渲染管线,同时给这个渲染管线资源传递一个引用
//接着渲染管线实例就可以访问上边定义好的配置数据
return new ExampleRenderPipelineInstance(this);
}
}
3.创建一个名为ExampleRenderPipelineInstance.cs的脚本
4.拷贝和粘贴以下代码到新创建的脚本:
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipelineInstance : RenderPipeline
{
//使用这个变量去引用渲染管线资源,这个渲染管线资源在构造函数中被赋值
private ExampleRenderPipelineAsset renderPipelineAsset;
//这个构造函数有一个ExampleRenderPipelineAsset类的实例作为它的参数
public ExampleRenderPipelineInstance(ExampleRenderPipelineAsset asset) {
renderPipelineAsset = asset;
}
//unity在当前渲染画面中为每个不同类型的摄像机每一帧调用这个方法一次
protected override void Render(ScriptableRenderContext context, Camera[] cameras) {
//这是一个使用来自渲染管线资源的数据的例子
Debug.Log(renderPipelineAsset.exampleString);
//你可以在这里编写自定义渲染的代码,自定义这个方法以至于自定义你的SRP
}
}
5.在Project视图中,你既可以点击加号(+)按钮,也可以点击相关的菜单,然后找到Create,再然后选择Rendering->Example Render Pipeline Asset.然后 unity就会在Project视图下创建一个新的渲染管线资源