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

news2024/11/15 14:02:40

文章目录

  • 一、概述
  • 二、应用阶段
  • 三、几何阶段
  • 四、光栅化阶段

一、概述

​ 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.coloradmin.cn/o/907900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows安装使用RocketMQ常见问题,及springboot整合

win安装rocketmq 官网下载二进制包:https://rocketmq.apache.org/download 解压到不包含中文及空格的目录,配置环境变量 ROCKETMQ_HOME4. 修改runbroker.cmd和runserver.cmd文件 文件地址在rocketmq安装目录下的bin文件夹中。 如果不修改可能会遇见以…

CSS伪类:where和:is

CSS伪类:where和:is 1 :where1.1 概述1.2 组合与叠加1.3 优先级1.4 安全性1.5 兼容性 2 :is兼容性 1 :where 1.1 概述 :where()接受选择器列表作为它的参数,将会选择所有能被该选择器列表中任何一条规则选中的元素。 例如,在以下代码中,a标…

linux安装 jdk

1.下载 jdk 网盘资源: 链接: https://pan.baidu.com/s/1Z-fyHGDyj9b_km6ymR6mZg?pwdwd42 提取码: wd42 2.上传至服务器并解压 这里是上传至/opt 文件夹,并创建了/opt/soft 文件夹,解压在此 cd /opt tar -zxvf ./jdk-8u321-linux-x64.t…

8月18日上课内容 Haproxy搭建Web群集

本章结构 课程大纲 Haproxy调度算法 常见的web集群调度器 目前常见的Web集群调度器分为软件和硬件软件 通常使用开源的LVS、Haproxy、Nginx 硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等 Haproxy应用分析 LVS在企业应用中…

微信小程序使用云存储和Markdown开发页面

最近想在一个小程序里加入一个使用指南的页面,考虑到数据存储和减少页面的开发工作量,决定尝试在云存储里上传Markdown文件,微信小程序端负责解析和渲染。小程序端使用到一个库Towxml。 Towxml Towxml是一个可将HTML、Markdown转为微信小程…

mysql 、sql server 游标 cursor

游标 声明的位置 游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明 游标的使用步骤 声明游标打开游标使用游标关闭游标 (sql server 关闭游标和释放游标) sql server 游标 declare my_cursor curs…

Redis企业级解决方案

缓存预热 “ 宕机 ” 服务器启动后迅速宕机 问题排查 1. 请求数量较高 2. 主从之间数据吞吐量较大,数据同步操作频度较高 , 因为刚刚启动时,缓存中没有任何数据 解决方案 准备工作: 1. 日常例行统计数据访问记录,统计访…

亚马逊云科技 云技能孵化营——机器学习心得

亚马逊云科技 云技能孵化营机器学习心得 前言什么是机器学习?机器学习如何解决业务问题?什么时候适合使用机器学习模型?总结 前言 很荣幸参加了本次亚马逊云科技云技能孵化营,再本期的《亚马逊云科技云技能孵化营》中&#xff0c…

eNSP综合小实验:VRRP、MSTP、Eth-Trunk、NAT、DHCP等技术应用

完成下图要求: 拓扑图: 配置命令: 由于交换机日志太多不便于复制,所以就复制命令。大概步骤如下: 第一步先分配IP地址,在sw1和sw2上创建VLAN100用于e0/0/3口配IP,在sw1、sw2、sw3、sw4上创建VL…

分布式搜索引擎----elasticsearch

目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…

快手大模型出炉【快意】来袭

「快意」大模型(KwaiYii) 是由快手AI团队从零到一独立自主研发的一系列大规模语言模型(Large Language Model,LLM),当前包含了多种参数规模的模型,并覆盖了预训练模型(KwaiYii-Base)…

10个比ChatGPT更值得体验的AI工具

打分依据:在制定比ChatGPT更酷的AI工具列表时,我们进行了广泛的研究,并考虑了各种因素,如性能、多功能性、创新性、用户友好度、集成契合度和行业影响及未来潜力等,根据这些指标仔细筛选和评估了一众AI工具&#xff0c…

(vue)多级表头且转为百分比显示

(vue)多级表头且转为百分比显示 <el-table-column align"center" label"近三个月数据情况"><el-table-column align"center" prop"amount" :label"tableLast[0]"><template slot-scope"{ row }"&g…

尚硅谷宋红康MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种&#xff0c;大致了解下即可 DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;定义了…

SynchronousQueue阻塞与ArrayBlockingQueue设置容量为1阻塞的区别

SynchronousQueue阻塞的地方是在put进去一个元素即阻塞&#xff0c;没办法继续执行&#xff0c;除非其他线程take该队列的元素。 而ArrayBlockingQueue设置容量为1阻塞的地方是在下一次put&#xff0c;也就是说&#xff0c;put一个元素之后还能继续往下执行代码。 public clas…

leetcode359周赛

2828. 判别首字母缩略词 核心思想:枚举。只需要枚举首字母和s是否一一对应即可。 2829. k-avoiding 数组的最小总和 核心思想&#xff1a;自己的方法就是哈希表&#xff0c;枚举i的时候&#xff0c;将k-i统计起来&#xff0c;如果出现了那么就跳过。灵神的方法是数学法&#…

Python学习 -- 类对象从创建到常用函数

在Python编程中&#xff0c;类是一种强大的工具&#xff0c;用于创建具有共同属性和行为的对象。本篇博客将详细介绍Python中类和对象的创建&#xff0c;类的属性和方法&#xff0c;以及一些常用的类函数&#xff0c;通过丰富的代码例子来帮助读者深入理解。 一、类和对象的创…

Spring之IoC容器篇

目录 1.Spring简介 1.1Spring框架的核心特性 2.Spring IoC容器 2.1Spring IoC容器特点 2.2出现的背景 2.3关于IoC的理解 2.4案例演示 3.Spring注入方式 3.1set注入 3.2构造注入 3.3接口注入 4.Spring上下文与tomcat整合 4.1思考 4.2代码演示 4.3收获 1.Spring简介…

【内网监控】通过cpolar实现远程监控

【内网监控】通过cpolar实现远程监控 文章目录 【内网监控】通过cpolar实现远程监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道&#xff0c;生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…