2023-08-21 Unity Shader 开发入门1 —— 渲染管线

一、概述

​ Unity 中的渲染管线和图形学中的渲染管线基本上指的是相同的概念,但是具体实现和细节方面可能存在一些差异。

​ Unity 的渲染管线建立在图形学的基础上,但具有自己的实现和拓展。其提供了一个高度可配置和可拓展的框架,允许开发者根据需求自定义渲染流程。

  • 渲染管线

    • 是计算机图形学中用于将三维场景转换为最终屏幕所见图像的过程;
    • 由一系列的阶段和操作组成,每个阶段都负责执行特定的任务;
    • 逐步处理输入的集合数据和纹理信息,最终生成可视化图像的过程。

    渲染管线(流水线)就是将数据分阶段的变为屏幕图像的过程!

  • 渲染管线中的数据

    1. 顶点数据:模型的顶点坐标、法线向量、纹理坐标等等;
    2. 纹理数据:纹理贴图等;
    3. 光照数据:光照参数、光源信息等;
    4. 其他 Unity场景上相关的数据
  • 渲染管线中的阶段

    渲染管线分为 3 个阶段:

    应用阶段 → 几何阶段 → 光栅化阶段

    在每一个阶段都会对数据进行处理,最终目的就是在屏幕上让我们看见最终的图像。

image-20230821194527218
图1 渲染管线中的阶段

二、应用阶段

  • CPU 和 GPU

    • CPU:中央处理器。

      负责算数运算、逻辑操作、数据传输等通用计算任务,同时还管理和调度计算机的资源(游戏开发中——游戏逻辑处理)。

    • GPU:图形处理器。

      是专门用于图形和并行计算的处理器。显卡即搭载 GPU 的硬件设备,显卡包含一个或多个 GPU 芯片,还包含显存(用于存储图像数据)、显示接口、视频解码器等等(游戏开发中——渲染相关处理)。

    CPU 主要处理操作系统管理、程序执行、通用计算等等;

    GPU 主要处理图形渲染、图像处理等等。

  • 应用阶段的任务

    渲染管线的应用阶段中大部分的内容都和渲染无关(比如:游戏逻辑处理、动画更新、物理模拟、场景管理等等)。

    当应用阶段完成后,后面的几何阶段以及光栅化阶段将开始处理和图形渲染相关的数据和操作。

    将应用阶段为什么会归纳到渲染管线中的原因是:应用阶段为渲染管线的后续提供了最重要的内容——数据。

    应用阶段主导者是 CPU。这一阶段将渲染需要用到的数据传递给 GPU 用于后续的两个阶段的处理。

    应用阶段的任务包括:

    1. 把不可见的物体数据剔除;
    2. 准备好模型相关数据(顶点、法线、切线、贴图、着色器等等);
    3. 将数据加载到显存中
    4. 设置渲染状态(设置网格需要使用那个着色器、材质、光源属性等等);
    5. 调用 DrawCall(CPU 通知 GPU 使用相关的数据和渲染状态进行渲染)。
    image-20230821185520287
    图2 应用阶段的主要任务

​ 在应用阶段中,主要按照 Unity 的规则进行游戏开发即可,需要注意的是关于 DrawCall 的优化。

  • DrawCall

    一次 DrawCall 是 CPU 命令 GPU 进行渲染的命令。DrawCall 多了会影响性能的主要瓶颈是 CPU。

    每次调用 DrawCall 之前,CPU 需要向 GPU 发送很多内容,包括数据、状态、命令等等。

    如果 DrawCall 过多,CPU 就会把大量的时间花费在提交 DrawCall 上,造成 CPU 过载,让玩家感受到卡顿。

    减少 DrawCall 的方式:批处理技术。

    1. 合并网格(可以将静态物体合并网格);

    2. 共用材质(在不同网格之间共用一种材质);

    3. 合并图集(2D 游戏和 UI 中,可以将多张图片合并为一张大图)等等。

三、几何阶段

  • 图元

    在渲染管线中,图元是指几何数据的基本单元,它是构成几何体的最小可绘制的单元。

    图元可以是点、线、三角形,在渲染管线的几何阶段,顶点数据会被组合为图元。

    这些图元将在后续的光栅化阶段转换为像素,最终呈现在屏幕上。

  • 几何阶段的任务

    几何阶段主要由 GPU 主导,因此我们无法拥有绝对的控制权,但是 GPU 为我们开放了部分控制权。

    几何阶段主要做的事情是:根据应用阶段输入的数据信息进行顶点坐标转换以及裁剪不可见图元等工作

    image-20230821191251227
    图3 几何阶段的主要任务
    1. 顶点着色器(完全可编程)

      它处理来自应用阶段由 CPU 传递过来的顶点相关数据,输入进来的每一个顶点都会调用一次顶点着色器中的逻辑

      顶点着色器需要完成的工作主要有:

      • 坐标变换 —— 顶点变换、法线变换、纹理坐标变换等;
      • 顶点属性处理—— 对顶点的其他属性进行处理,比如顶点颜色、透明度、切线向量等,可以用于实现顶点动画、着色、光照等效果;
      • 顶点插值 —— 计算顶点属性的插值值;
      • 等等。
    2. 曲面细分着色器、几何着色器

      可选的着色器,并且需要硬件和驱动程序的支持才能使用,因此不展开介绍。

    3. 裁剪

      裁剪阶段会自动将不在视野内和部分在视野内的图元(点、线、三角形)进行裁剪。

      在该过程中可以进行一些配置,但是一般不需要进行任何处理,渲染管线会自动进行处理。

    4. 屏幕映射

      将输入的三维坐标系下的图元坐标转换到屏幕坐标系中。

  • 几何阶段为渲染准备的内容

    在渲染管线(流水线)的几何阶段:

    最主要做的工作就是:对顶点进行处理,并进行坐标转换,裁剪画面外的图元

    最主要完成的就是:将模型的顶点从其本地坐标 转换到最终的屏幕坐标中

    在顶点着色器中进行一些操作就可以带来不同的表现效果的体现,比如:水波纹、布料等等。

四、光栅化阶段

  • 像素

    像素是计算机图形学中的基本概念,它是组成图像的最小可控单位,具有位置和属性,用于表示图像中的颜色和其他信息。

    它是二维图像中的一个点,每个像素都占据屏幕上的一个固定位置。

    比如我们常见的显示器分辨率为:1920 × 1080,就表示宽度为 1920 个像素、高度为 1080 个像素。

  • 片元

    在渲染管线中,片元是指在光栅化阶段生成的像素或像素片段,是渲染管线中进行像素级别操作和计算的基本单位。

    每个片元代表了屏幕上的一个像素,并且具有位置信息和与之相关的属性,比如:颜色、深度值、法线等等。

  • 光栅化阶段的任务

    光栅化阶段同样由 GPU 主导,同样我们无法拥有绝对的控制权,同样 GPU 为我们开放了部分控制权。

    光栅化阶段主要做的事情是根据几何阶段输入的信息计算每个图元覆盖哪些像素,以及为这些像素计算他们的颜色等等工作。

    image-20230821193546872
    图4 光栅化阶段的主要任务
    1. 三角形设置

      几何阶段输入到光栅化阶段的数据主要是三角形网格的顶点信息,得到的只是三角形网格每条边的两个端点信息。

      如果想要得到整个三角形网格对像素的覆盖情况,就必须计算每条边上的像素坐标,为了能计算三角形边界像素的坐标信息,我们必须得到三角形边界的表示方式。

      在此阶段,GPU 主要做的事情是计算三角形网格的表示数据。

    2. 三角形遍历

      该阶段主要根据三角形设置中计算出的三角形网格数据,检查每个像素是否被一个三角形网格所覆盖。

      如果覆盖的话,就会生成一个片元(包含屏幕坐标、深度、法线等等信息),此阶段也被成为扫描变换。

      在此阶段,GPU 主要做的事情是根据三角形网格信息得到被它们覆盖的片元序列。

      image-20230821193929912
      图5 三角形遍历示意
    3. 片元着色器(完全可编程)

      主要完成对三角形遍历输入的片元序列中的 每个片元(像素)的着色计算和属性处理。

      片元着色器需要完成的工作主要有:

      • 光照计算 —— 计算片元的光照效果;
      • 纹理映射 —— 根据片元在纹理中的位置,对纹理进行采样,将纹理颜色映射到片元上,实现表面贴图效果;
      • 材质属性处理 —— 根据材质的属性,比如颜色、透明度、反射率等,计算片元的最终颜色和透明度;
      • 阴影计算 —— 根据光源等信息,计算片元是否处于阴影中,影响其最终颜色;
      • 等等。
    4. 逐片元操作(可配置)——输出合并阶段

      主要完成对片元着色器输出数据(最终颜色、法线、纹理坐标、深度等)进行各种处理和计算。

      逐片元操作主要完成的工作主要有:

      • 决定每个片元的可见性,比如深度测试、模板测试;
      • 如果通过了所有测试,需要把片元的颜色值和已经存储在颜色缓冲区的颜色进行合并(混合);
      • 等等。
  • 光栅化阶段为渲染准备的内容

    在渲染管线(流水线)的光栅化阶段:

    最主要做的工作是:对片元(像素)进行最终处理

    最主要完成的是:确定片元(像素)最终是否渲染到屏幕上,并且确定其的最终渲染的颜色效果

    在片元着色器中进行一些处理就可以带来不同的表现效果的体现,比如:逼真的水面效果、火焰、黑白、模糊等等效果。

猜你喜欢

转载自blog.csdn.net/zheliku/article/details/132415439