文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。
本系列原更新于作者的github博客,这里给出链接

这一节主要是为上一节中没有提到的一些概念作补充。

上一节提到了Unity中渲染路径的概念,为了更好地理解并使用Unity,我们有必要了解有关渲染路径的详细信息。

Unity Render Pipeline

Unity作为引擎,为我们处理了许多渲染有关的行为细节,最终留下了Built-in Renderer(内置渲染),以及配置度更高的SRP(Scriptable Render Pipeline,可编程渲染管线)

Built-in Renderer

Built-in Renderer是Unity的默认渲染设置,也是一直以来使用的渲染方式。Built-in Renderer为我们处理了绝大多数的细节。Built-in Renderer可以分为Forward(前向) Shading、Deferred(延迟) Shading和Built-in。

Built-in

这是Unity的默认渲染路径。

Forward Shading

在前向渲染中,每个作用于物体的Per-Pixel Light都会单独计算一次,Draw Call数量跟物体数量和光照数量的乘积成正比。它不受硬件限制,可以使用Multi-Sampling Anti-Aliasing(多重采样抗锯齿)等。但在这个模式下,除了Main Directional Light之外,一个物体最多接受4个Per-Pixel Light,超过的部分都会转换为Per-Vertex Light。

Deferred Shading

延迟渲染是通过G-Buffer(几何缓冲)实现的。G-Buffer储存了物体的颜色,法线,材质信息。这个渲染路径没有光照数量的限制,每一个光源都会被视为Per-Pixel Light,都会拥有cookie和shadow。在这个模式下,光照处理的性能消耗和被光照影响的像素数成正比。也就是说,我们可以通过减弱光源强度,缩小光源影响范围,进而提升性能。由于真正的渲染操作被延迟,这个模式不支持多采样抗锯齿和半透明物体的渲染,也不支持Mesh Renderer组件的Receive Shadows设置,剔除选项的受支持度也很有限。

Scriptable Render Pipeline

Unity引擎的内核是C++编写的,外壳是C#脚本构建的,脚本实现各模块之间的交互,编辑器界面等,许多行为都在内核进行了处理,作为游戏开发者只能接触到界面以及API,无法定制化渲染。随着硬件的升级,游戏体量的增加以及游戏玩家对游戏画面的要求逐渐升高,这种配置式的设置就显现出了不足之处。为了适应游戏开发者的需要,Unity决定实现一种新的架构,只在C++端保留渲染的核心功能,把更多的选择交给C#脚本,把控制权移交给开发者,并在2018中加入了SRP。

SRP是一系列C#的API,用于配置各个渲染设置。SRP有三种形式:LWRP(Lightweight Render Pipeline,轻量级渲染管线,这在目前已经得到了官方较好的支持)、HDRP(Hight Definition Render Pipeline,高清渲染管线,目前仍在试验阶段)、自定义渲染管线。LWRP和HDRP都是SRP的一套Asset,LWRP性能较好,HDRP需要更好的硬件支持,当然渲染效果也会更加真实,自定义渲染管线则是基于SRP的接口自定义的一套适用于自己工程的渲染管线配置。

1.5:Unity Render Pipeline的更多相关文章

  1. unity render pipeline

    post process v2 GUI temp8->TaregtPool0->temp8       tem8                      temp8->backbu ...

  2. 1.3:Render Pipeline and GPU Pipeline

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 在学习SubShader之前,我们有必要对 Render Pipeline ...

  3. [Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)

    Shader Graph Error  : The current render pipeline is not compatible with this master node 问题产生环境: Un ...

  4. Lightweight Render Pipeline

    (翻译) Lightweight Render Pipeline (LWRP),轻量级渲染管线,是一个Unity预制的Scriptable Render Pipeline (SRP).LWRP可以为移 ...

  5. Scriptable Render Pipeline

    Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...

  6. 【Unity Shaders】使用Unity Render Textures实现画面特效——建立画面特效脚本系统

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  7. WebGPU学习(十一):学习两个优化:“reuse render command buffer”和“dynamic uniform buffer offset”

    大家好,本文介绍了"reuse render command buffer"和"dynamic uniform buffer offset"这两个优化,以及Ch ...

  8. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  9. Cesium原理篇:6 Render模块(4: FBO)

    Cesium不仅仅提供了FBO,也就是Framebuffer类,而且整个渲染过程都是在FBO中进行的.FBO,中文就是帧缓冲区,通常都属于高级用法,但其实,如果你了解了它的基本原理后,用起来还是很简单 ...

随机推荐

  1. ASP.NET JS调用WebService——简单例子

    一.创建好WebService 二.编辑页面与js 三. 运行页面并点击按钮,结果如下 简单调用吧!

  2. Appium-Python-Windows环境搭建笔记

    Appium版本:1.11.0 操作系统:Windows7-64位 开发语言:Python 3.7.2 测试应用平台:安卓 5.1.1 Appium服务端 一.JDK 也许你会觉得很奇怪,我搭建Pyt ...

  3. jenkins测试配置

  4. C++———库函数cstring及string方法解读

    1.string与cstring区别 <string>是C++标准库头文件.包含了拟容器class std::string的声明(不过class string事实上只是basic_stri ...

  5. JAVA RPC (七) 手把手从零教你写一个生产级RPC之client请求

    上节说了关于通用请求代理,实际上对spring的bean引用都是通过koalasClientProxy来实现的,那么在代理方法中才是我们实际的发送逻辑,咱们先看一下原生的thrift请求是什么样的. ...

  6. 解决 warning I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

    只需要加载如下代码: import os os.environ['

  7. Linux下安装scikit-learn

    Linux下安装scikit-learn sudo apt-get install python-pip sudo apt-get install python-pandas python-sympy ...

  8. jQuery动画方法

    下面介绍一些使用jQuery实现动画的方法: html中有如下代码: <button id="btn-box1">show</button> <but ...

  9. 从零开始一起学习SLAM | 掌握g2o边的代码套路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...

  10. java String补足

    regionMatches()方法: equals 比较内容  == 比较的是地址