当前位置: 首页 > news >正文

Unity是如何把3D场景显示到屏幕上的——Unity的渲染过程

前段时间在看Shader Graph的时候,发现很多基本概念搞不懂,于是刨了一下Unity的的渲染过程,权当复习计算机图形学了。毕竟奔五的老头了,年事渐高,记性也越发不济,便把学到的东西整理成了这篇笔记。其中若有疏漏或错误之处,还恳请不吝指正。

文章目录

  • 一、Unity的渲染的过程包含哪几个阶段?
  • 二、扫清障碍——基本概念解释
    • 1、缓冲区(Buffer)
      • (1)缓冲区
      • (2)帧缓冲区
      • (3)颜色缓冲区(Color Buffer)
      • (4)深度缓冲区(Depth Buffer)
      • (5)模板缓冲区(Stencil Buffer)
      • (6)缓冲区的示意图
      • (7)帧缓冲区与颜色、深度、模板缓冲区的关系
      • (8)帧缓冲区是全局公用的吗?是的
      • (9)什么是【深度测试】?
      • (10)什么是【模板测试】?
    • 2、Unity中的MeshFilter和MeshRenderer渲染组件
      • (1)MeshFilter组件
      • (2)MeshRenderer组件
    • 3、几何阶段的相关概念
      • (1)几何阶段是做啥的?
      • (2)什么是图元?
      • (3)几何计算阶段会产生大量的图元?
      • (4)什么是【顶点变换】?
      • (5)什么是【模型空间】、【世界空间】、【相机空间】、【裁剪空间】、【屏幕空间】?
      • (6)什么是【顶点着色器】
      • (7)什么是【图元组装】
    • 4、光栅化相关概念
      • (1)什么是【光栅化】
      • (2)光栅化的作用
      • (3)什么是【片段】
      • (4)为什么叫【片段】
      • (5)【片段】包含写什么信息(结构)
    • 5、像素处理阶段(片段着色阶段)
      • (1)什么是【像素处理阶段】
      • (2)【像素处理阶段】的处理流程是啥?
      • (3)【像素处理阶段】的几个缓冲区概念
      • (4)什么是片段着色器
  • 三、一个案例的渲染流程

一、Unity的渲染的过程包含哪几个阶段?

包含以下四个阶段:应用程序阶段、几何阶段、光栅化阶段、像素处理阶段
在这里插入图片描述
每个阶段包含哪些操作:
在这里插入图片描述

二、扫清障碍——基本概念解释

1、缓冲区(Buffer)

【缓冲区】这个词出现在【像素处理阶段】,讲的是在像素处理阶段,GPU会把像素信息包(又名“片段”)进行渲染,选然后依据深度信息进行评判,剔除一些看不见的信息,然后把要显示的信息更新到帧缓冲区里面(它有颜色、深度、模板三个缓冲区组成)。

渲染管线中,是用来临时存储数据的内存区域。存储的对象是渲染过程中产生的像素、深度、颜色等信息。

(1)缓冲区

在这里插入图片描述
渲染管线中,是用来临时存储数据的内存区域。存储的对象是渲染过程中产生的像素、深度、颜色等信息。

(2)帧缓冲区

在这里插入图片描述
一个综合的缓冲区,可能包含颜色缓冲区、深度缓冲区和模板缓冲区,用于存储最终的渲染结果。该缓冲区它是一个逻辑概念,不是物理结构,它实际由颜色、深度、模板三个缓冲区构成。

(3)颜色缓冲区(Color Buffer)

在这里插入图片描述

存储每个像素的颜色信息(RGB或RGBA)。这是渲染后直接影响屏幕显示的主要缓冲区。

(4)深度缓冲区(Depth Buffer)

在这里插入图片描述

也叫Z缓冲区,存储每个像素的深度值(距离相机的远近),用于确定哪些物体在其他物体前面,解决遮挡问题。

(5)模板缓冲区(Stencil Buffer)

在这里插入图片描述

用于存储模板值,常用于实现特定的渲染效果,如遮罩、轮廓、反射等。

(6)缓冲区的示意图

在这里插入图片描述

(7)帧缓冲区与颜色、深度、模板缓冲区的关系

在这里插入图片描述

(8)帧缓冲区是全局公用的吗?是的

在这里插入图片描述

(9)什么是【深度测试】?

像素处理阶段:深度测试解决基本的空间遮挡,判断某像素坐标处的几个【片段】的【深度值】,保留近的,舍弃远的。
在这里插入图片描述

(10)什么是【模板测试】?

像素处理阶段:模板测试则用于实现局部渲染、遮罩、轮廓线等定制化效果
在这里插入图片描述

2、Unity中的MeshFilter和MeshRenderer渲染组件

(1)MeshFilter组件

在这里插入图片描述

  • 意为“网格过滤器”或者“网格提供者”
  • 这个组件,界定了一个物体的外形,外形的意思就是物体的几何数据——顶点数据(位置、UV、法线、切线),以及面数信息(三角形索引信息)。
  • 只提供数据,不处理渲染逻辑。

(2)MeshRenderer组件

在这里插入图片描述

  • 网格渲染组件
  • MeshRenderer 是一个 Unity 组件,负责将 MeshFilter 提供的几何数据提交给渲染管线,并结合材质(Material)进行渲染。
  • 它的作用 :
    • 提交渲染命令:将 MeshFilter 的网格数据和材质信息传递给 URP,触发渲染。
    • 定义外观:通过材质和 Shader 控制物体的颜色、纹理、光照效果(如漫反射、镜面高光)。
    • 控制渲染行为:设置渲染队列(不透明/透明)、阴影投射/接收、光探针使用等。

3、几何阶段的相关概念

(1)几何阶段是做啥的?

  • 几何阶段用到的信息来自哪里
    在 Unity 的 URP(通用渲染管线,Universal Render Pipeline) 中,几何阶段(Geometry Stage) 的输入是 3D 模型的网格数据及其相关属性,具体由 MeshFilter 和 MeshRenderer 组件提供的数据组成,但这些组件本身不是直接输入,而是通过它们在应用程序阶段准备的数据传递到 GPU

  • 把场景中要渲染的物体,在【顶点着色器】的加持下,经过历次空间坐标变换,从把要渲染的物体从模型空间——>世界空间——>相机空间——>裁剪空间——>屏幕空间,逐次变换。

  • 进行图元组装:把3D物体切碎成基本的渲染图形,最后组装成一个又一个的信息包。

  • 裁剪操作:把看不见的图元删除

(2)什么是图元?

在这里插入图片描述

  • 图元的这个词的来源: 来自英文“Primitive”,意思是【原始的】、【基本的】,在图形学中指【渲染管线中最基本的几何形状】,如三角形(Triangle)、线段(Line)、点(Point)。或者改为【基本图形】、【绘制单元】更好理解。

  • 图元包含的信息:
    在这里插入图片描述

(3)几何计算阶段会产生大量的图元?

在几何处理中,确实会根据需求生成大量图元,且这些图元通常以最基础的图形(点、线段、三角形)为单位。这是因为复杂的几何模型或场景往往需要通过这些 “最小单元” 来精确描述,同时也便于计算、渲染和存储。
在这里插入图片描述

(4)什么是【顶点变换】?

顶点变换就是把场景里要渲染的物体,不断地进行坐标变换,是他们从模型坐标,变换到屏幕坐标。有【顶点着色器】完成。
在这里插入图片描述

(5)什么是【模型空间】、【世界空间】、【相机空间】、【裁剪空间】、【屏幕空间】?

在这里插入图片描述

(6)什么是【顶点着色器】

在这里插入图片描述

(7)什么是【图元组装】

在这里插入图片描述

4、光栅化相关概念

(1)什么是【光栅化】

CRT显示器在显示图像的时候,电子枪逐行扫射屏幕上的荧光点,屏幕被颜色“格子”填满后,便产生了图像。这个过程以前叫“光栅化”。
在这里插入图片描述

(2)光栅化的作用

在这里插入图片描述

(3)什么是【片段】

在这里插入图片描述

  • 背景知识:
    1、【光栅化】阶段把【图元】处理成【片段】。
    2、【光栅化】就是把【裁剪空间】的数据处理成【屏幕空间】的数据。

在这里插入图片描述屏幕空间中的每个像素点,要显示内容为裁剪空间中对应位置的物体信息,一个像素点要显示的内容可能不止一个,那么,这些要显示在某个像素点的一个或者多个内容,就是片段。

(4)为什么叫【片段】

在这里插入图片描述为什么叫片段?
【光栅化】阶段的扫描工作,把一个3D图元“切碎”成覆盖屏幕像素的小块。每个小块对应一个像素,就是一个“片段”。

(5)【片段】包含写什么信息(结构)

在这里插入图片描述

5、像素处理阶段(片段着色阶段)

(1)什么是【像素处理阶段】

像素处理阶段(Fragment Processing Stage) 是渲染管线的核心阶段,由 GPU 执行,负责处理光栅化阶段生成的片段(Fragment),为每个像素计算最终颜色并决定渲染结果。

(2)【像素处理阶段】的处理流程是啥?

在这里插入图片描述

(3)【像素处理阶段】的几个缓冲区概念

在这里插入图片描述

在这里插入图片描述

(4)什么是片段着色器

  • 定义: 片段着色器是一个可编程的 GPU 程序,处理光栅化阶段生成的片段,计算每个片段的颜色(RGBA)和其他输出(如深度或模板值),决定像素在屏幕上的最终外观。
  • 位置: 运行在像素处理阶段,在光栅化阶段(生成片段)之后,后处理阶段(如颜色分级)之前。
  • 核心特点:
    逐片段处理:每个片段独立运行一次片段着色器。
    主要输出颜色值,供后续测试和写入渲染目标(如颜色缓冲区)。

三、一个案例的渲染流程

  • Unity
  • URP
  • 单相机
  • 场景有三个立方体A、B、C
    在这里插入图片描述
http://www.dtcms.com/a/295527.html

相关文章:

  • 实战演练—基于Transformers的NLP解决方案总结
  • Python实现PDF按页分割:灵活拆分文档的技术指南
  • 【Rust线程】Rust高并发编程之线程原理解析与应用实战
  • K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
  • 【REACT18.x】CRA+TS+ANTD5.X封装自定义的hooks复用业务功能
  • 初识opencv03——图像预处理2
  • C++vector(2)
  • TreeMap一致性哈希环设计与实现 —— 高可用的数据分布引擎
  • 【RAG优化】RAG应用中图文表格混合内容的终极检索与生成策略
  • 【AI】Jupyterlab中打开文件夹的方式
  • 元宇宙工厂网页新形态:3D场景嵌入与WebGL交互的轻量化实现
  • MySQL 表的操作
  • 奇异值分解(Singular Value Decomposition, SVD)
  • 武汉火影数字|数字党建展厅制作 VR红色数字纪念馆 党史馆数字化打造
  • Windows 10 远程桌面(RDP)防暴力破解脚本
  • Linux内核中动态内存分配函数解析
  • 滑动窗口机制及其应用
  • 云渲染的算力困局与架构重构:一场正在发生的生产力革命
  • Apache POI 实战应用:企业级文档处理解决方案
  • 5.7 input子系统
  • uboot FPGA调试环境搭建
  • C++ <多态>详解:从概念到底层实现
  • 不同头会关注输入序列中不同的部分和不同维度所蕴含的信息,这里的头和嵌入维度不是对应的,仅仅是概念上的吗?
  • 在Ubuntu上使用QEMU学习RISC-V程序(1)起步第一个程序
  • 负载均衡-LoadBalance
  • YOLOv4深度解析:革命性的实时目标检测技术
  • 基于Zig语言,opencv相关的c++程序静态交叉编译
  • USRP X440
  • Vulnhub Web-Machine-N7靶机攻略(附VB安装教程)
  • Docker快速安装Clickhouse