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. 逐片元操作(可配置)——输出合并阶段

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/85638.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在服务器上用kaggle下载数据集

S1 服务器上安装kaggle cli工具 pip install --user kaggleS2 服务器上创建kaggle目录 mkdir ~/.kaggleS3 进入kaggle账户创建token 生成token 点击右上角头像,选择setting 点击create new token 进入你的浏览器下载页,可以看到有了一个kaggle.jso…

数据结构-----树的易错点

1.树的度和m叉树 •度为m的树&#xff08;度表示该结点有多少个孩子&#xff08;分支&#xff09;&#xff09; 任意结点的度<m(最多m个孩子) 至少又一个结点度m(有m个孩子) 一定是非空树&#xff0c;至少有m1个结点 •m叉树 任意结点的度<m(最多有m个孩子) 允许所…

计算机竞赛 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

根据源码,模拟实现 RabbitMQ - 虚拟主机 + Consume设计 (7)

目录 一、虚拟主机 Consume设计 1.1、承接问题 1.2、具体实现 1.2.1、消费者订阅消息实现思路 1.2.2、消费者描述自己执行任务方式实现思路 1.2.3、消息推送给消费者实现思路 1.2.4、消息确认 一、虚拟主机 Consume设计 1.1、承接问题 前面已经实现了虚拟主机大部分功…

软考高级系统架构设计师(二)计算机操作系统

【原文链接】软考高级系统架构设计师&#xff08;二&#xff09;计算机操作系统 2.1 进程管理 2.1.1 操作系统的三个重要作用 管理计算机中运行的程序和分配各种软硬件资源为用户提供友善的人机界面为应用程序的开发和运行提供一个高效的平台 2.1.2 操作系统的四个特征 并…

Linux入门

一、安装相关软件 1.下载vmware (很容易下载,搜一下官网 ) 在cmd敲入 ncpa.cpl &#xff0c;查看是否有vmware 2.下载centos 下面是镜像源网站&#xff0c;当然你可以选择其他的镜像源&#xff0c;像清华镜像源和阿里镜像源。 Index of /centos/7.9.2009/isos/x86_64/ | …

三分钟解决AE缓存预览渲染错误、暂停、卡顿问题

一、清除RAM缓存&#xff08;内存&#xff09; 你应该做的第一件事是清除你的RAM。这将清除当前存储在内存中的所有临时缓存文件。要执行此操作&#xff0c;请导航到编辑>清除>所有内存。这将从头开始重置RAM缓存 二、清空磁盘缓存 您也可以尝试清空磁盘缓存。执行此操作…

Linux之维护基本存储空间

目录 维护基本存储空间 1.查看磁盘信息&#xff08;块设备&#xff09;信息 2.创建分区 (1)MBR分区 标准MBR结构如下 为什么MBR最多只能有4个主分区 (2)GPT分区 优点 3.分区工具 1.使用fdisk管理MBR分区 语法格式 参数及作用 2.使用gdisk管理GPT分区 操作步骤 3.使用pa…

Mimikatz免杀实战:绕过360核晶和defender

文章目录 前言绕过360核晶实现思路完整代码运行测试 绕过WD实现思路MiniDumpWriteDump回调函数加密dump文件 完整代码运行测试 参考文章 前言 通常来说&#xff0c;即使我们成功实现了mimikatz的静态免杀&#xff0c;其抓取hash的行为仍可能会被防病毒软件检测到虽然你可以通过…

sass笔记

声明变量 通过$标识符进行命名及引用混合器 类似vue中的函数 通过 mixin标识定义 include 标识调用& 父选择器标识extend 进行继承可嵌套可导入 通过 import 文件位置’ 、进行导入 <style> //1 声明变量 $name: 15px; $color: skyblue;mixin border-radius($num) {/…

Docker(一) 安装Docker

一、安装 安装前置条件 yum install -y yum-utils device-mapper-persistent-data lvm2 更换数据源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 1、指定版本安装 yum list docker-ce --showduplicates | sort -r yum …

【3Ds Max】可编辑多边形“边”层级的简单使用

目录 简介 示例 1. 编辑边 &#xff08;1&#xff09;插入顶点 &#xff08;2&#xff09;移除 &#xff08;3&#xff09;分割 &#xff08;4&#xff09;挤出 &#xff08;5&#xff09;切角 &#xff08;6&#xff09;焊接 &#xff08;7&#xff09;桥 &…

【php】windows下php运行已有php web项目环境配置教程

php环境配置教程 php安装composer安装扩展安装redis扩展安装 composer install 本文操作系统使用的是win11&#xff0c;软件PhpStorm 2023.1 php安装 要安装的php版本可以在composer.json看到&#xff0c;下载安装对应版本 windows下载地址https://windows.php.net/download …

链表OJ题

今天继续分享我们关于链表的OJ题。 第一题 合并升序链表 这道题我们可以这样理解&#xff0c;首先是不带哨兵位&#xff0c;我们先给一个head和tail指针&#xff0c;然后第一个链表和第二个链表进行比较&#xff0c;如果list1的数据比list2的数据大的时候&#xff0c;我们就尾…

juc基础(二)

目录 一、集合的线程安全 1、List集合 2、hashset 3、hashmap 二、多线程锁 三、Callable&Future 接口 1、Callable接口 2、Future 接口 3、FutureTask 四、JUC 三大辅助类 1、减少计数 CountDownLatch 2、 循环栅栏 CyclicBarrier 3、信号灯 Semaphore 一、…

Android开发基础知识总结(四)简单控件(下)

一.按钮触控 最常见的按钮button类继承自Textview类。 需要注意的是&#xff0c;在Button中显示的单词默认全部大写 ~ public void onClick(View v){s1et1.getText().toString();//有一些小bug&#xff0c;好像变量必须声明在Onclick方法内部才有效&#xff1f;&#xff1f;&am…

SpringMVC拦截器学习笔记

SpringMVC拦截器 拦截器知识 拦截器(Interceptor)用于对URL请求进行前置/后置过滤 Interceptor与Filter用途相似但实现方式不同 Interceptor底层就是基于Spring AOP面向切面编程实现 拦截器开发流程 Maven添加依赖包servlet-api <dependency><groupId>javax.se…

Hadoop小结(上)

最近在学大模型的分布式训练和存储&#xff0c;自己的分布式相关基础比较薄弱&#xff0c;基于深度学习的一切架构皆来源于传统&#xff0c;我总结了之前大数据的分布式解决方案即Hadoop&#xff1a; Why Hadoop Hadoop 的作用非常简单&#xff0c;就是在多计算机集群环境中营…

【经验】VScode 远程连接 Ubuntu 出错,Could not establish connection

用VScode常常会碰到以下情况&#xff0c;Could not establish connection。 先介绍一下VScode远程连接和终端SSH连接的区别&#xff1a;终端直接用SSH连接时&#xff0c;只需要开启SSH服务&#xff0c;并消耗少量的内存即可&#xff1b;VScode连接时&#xff0c;会自动在服务器…

二、Kafka快速入门

目录 2.1 安装部署1、【单机部署】2、【集群部署】 2.2 Kafka命令行操作1、查看topic相关命令参数2、查看当前kafka服务器中的所有Topic3、创建 first topic4、查看 first 主题的详情5、修改分区数&#xff08;注意&#xff1a;分区数只能增加&#xff0c;不能减少&#xff09;…
最新文章