class unity 定义类_Unity自定义着色管线-读Catlike-coding

原文链接:

Custom Pipeline​catlikecoding.com
e63b3ca615af8bc6e982aed90cca29d0.png

Custom Pipeline Taking Control of Rendering

  • 创建管线资源和实例
  • 剔除,过滤,排序,渲染
  • 保持内存干净
  • 提供良好的编辑经验

先上作者的结果:

3594e19d23ae8c3cb6d5bef682e638e1.png
新渲染管线

看到这里我也没有明白为什么需要自定义着色管线,unity本身不是有延迟着色和前向着色吗,感觉也蛮方便的,推出这个新东西目的是什么呢?先不管,继续往下看看再说.

1.创建一个管线:

为了渲染任何物体,unity必须知道需要渲染物体的形状,什么时候,在什么地方绘制,除此之外还需要知道什么设置。根据想要的效果,这些配置会相当复杂。光照,阴影,透明,图片效果,体渲染效果等,所有的效果都需要按照正确的顺序处理,最终才能得到正确的效果。这就是众所周知的渲染管线。

unity支持两种预定义的渲染管线,一种是前向渲染,另一种是延迟渲染(也在unity5.中支持一种较为老的延迟渲染方式)。这些管线是固定的,你可以决定启用,或者不启用,或者覆写(override)管线中的某些模块,但是不可能对这些管线的从根本上的设计进行大的改变。(这里我理解成,你可以自己做一些修修改改,但是整个流程你只能根据人家设计好的流程走,就是说人家说1这样,2那样,...我们做的时候也得按照这个顺序,但是可以1.不这样.2。)

unity2018支持scriptable render pipelines,字面意思来看就是能够对渲染管线编写脚本去控制渲染管线,那就直接翻译成可编程渲染管线(srp),srp能够让用户自己设计渲染管线,有些功能还是需要unity来做,比如说culling。Unity2018介绍了用srp做的两种新管线,一种是轻量级的管线,另一种是high-definition(高清晰?,高自定义?)管线,这两种管线都还处于预览阶段,可编程渲染管线API仍然还是个实验阶段的技术(卧槽,我还想看看有没有可能用在项目里)。不说了,来试试这玩意的效果。

本章就做一个迷你渲染管线,然后画unlit shape。成功的话,就在后边的章节中继续扩展,增加一些光照,阴影,更多的高级特征。不成功就拉倒,各回各家各找各妈。

1.1工程配置:

作者这里使用的unity版本是2018.2.9f1,但是任何2018.2version或者更高的版本 都能够起作用。创建一个standard 3D project ,analytics disabled.因为要创建我们自己的渲染管线,所以不要选择管线选项。

打开之后移除所有的Window/Package Manager中的packages,只保留Package Manager UI。好吧,我没有成功移除.

eb54d6ac4ef87a859a96507b9f22f0af.png

本章工作在线性颜色空间中,但是unity2018使用默认的gamma空间。所以得设置一下,Edit / Project Settings / Playerand switchColor Spacein theOther Settingssection toLinear.

89149830fff62875e714fba0f7f83699.png

那么先用一些简单的材质来测试管线,目前先创建四种材质。不翻译了,直接贴出来看起来还快些:First,standard opaque material with a red albedo,

Second, the same material but withRendering Mode set toTransparent and a blue albedo with decreased alpha

Third, a material using theUnlit/Colorshader with its color set to yellow.

And finally a material using theUnlit/Transparentshader without any changes, so it appears solid white.

86ac37f980dc071a54bb198c95c3a541.png

1.2管线资源:

unity默认使用前向渲染管线。为了使用自定义管线,我们必须在图形设置中选择一种,图形设置可以在Edit / Project Settings / Graphics找到.

为了设置我们自己的管线,我们必须指定一种管线资源给SRPScriptable Render Pipeline Settings设置,这种资源必须扩展自RenderPiplineAsset,这是一种ScriptableObject 类型.

为我们自定义管线资源创建一个新脚本。管线资源就简单的命名为My Pipline.资源类型将会扩展自RenderPiplineAssert.

            using UnityEngine;
            using UnityEngine.Experimental.Rendering;

            public class MyPipelineAsset : RenderPipelineAsset {}

管线资源的主要意义在于hold管线对象实例,资源本身就是一个句柄,举例子说,资源就是一个装载管线设置的地方。目前还没有给资源任何设置,下面就要将资源实例交给unity。这个操作通过override InternalCreatePipeline 方法.但是我们还没有定义我们的管线对象,所有只需要返回空就可以了。

        public class MyPipelineAsset : RenderPipelineAsset {

	protected override IRenderPipeline InternalCreatePipeline () {
		return null;
	}
}

返回类型为IRenderPipline,这是个什么类型???是个接口类型

有必要解释一下:接口就像一个类,但是与类不同的是它只是定义了一个函数而不需要实现。它仅定义properties,events,indexers,and method signatures(这些属于C#的概念),以上都需要通过public定义,任何类型扩展自interface必须去包含在接口中定义的函数的实现。约定是在接口类型前面加上I。

因为接口不包含具体实现,所以对于类甚至结构体,能够扩展自一个或者多个接口。如果多个接口定义了一个东西,they just agree that the functionality should be there。但是这对于类来说是不可行的,这里应该是说多继承吧,C#中类不能够多继承。

现在需要增加这种类型的资源给我们的工程。To make that possible, add aCreateAssetMenuattribute toMyPipelineAsset.

    [CreateAssetMenu]
public class MyPipelineAsset : RenderPipelineAsset {}

为了能够进入Asset/Create menu.将其放入 Rendering submenu。通过设置 menuName 属性资源给 Rendering/My Pipeline。属性能够直接设置......

[CreateAssetMenu(menuName = "Rendering/My Pipeline")]
public class MyPipelineAsset : RenderPipelineAsset {}

创建Pipline

0f2e460eafc4dcd1cd07f07e90345576.png

赋给SRP设置:

d8a9e0c2f3dd7d7029da0772ea71d999.png

game窗口一篇漆黑,打开 FrameDebugger看看,看起来game window什么都没有。

1.3管线实例

为了创建有效的管线,我们必须提供对象实例,实现IRenderPipline。

using UnityEngine;
using UnityEngine.Experimental.Rendering;

public class MyPipeline : IRenderPipeline {}

也可以扩展抽象RenderPipeline 类 .这个类型提供了IRenderPipline的基本实施.

 public class MyPipeline : RenderPipeline {}

返回实例

      protected override IRenderPipeline InternalCreatePipeline () {
		return new MyPipeline();
	}

2.Context(上下文)

RenderPipeline包含定义在IRenderPipeline接口中Render方法的具体实现.它的第一个参数是渲染上下文ScriptableRenderContext结构,第二个参数是摄像机,包含了所有需要被渲染的摄像机.RenderPipeline.Render不绘制任何物体,仅检查管线对象对于渲染的使用是否有效.

        public class MyPipeline : RenderPipeline {

	public override void Render (
		ScriptableRenderContext renderContext, Camera[] cameras
	) {
		base.Render(renderContext, cameras);
	}
}

先存着......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值