GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记

news2024/11/24 17:27:17

文章目录

  • 概览:游戏引擎中的渲染系统
    • 四个课时概览
  • 一,渲染管线流程
  • 二,了解GPU
    • SIMD 和 SIMT
    • GPU 架构
    • CPU到GPU的数据传输
    • GPU性能限制
  • 三,可见性
    • Renderable可渲染对象
    • 提高渲染效率
    • Visibility Culling 可见性裁剪
  • 四,纹理压缩(Texture Compression)
  • 五,Cluster-Based Mesh Pipeline
  • 总结


概览:游戏引擎中的渲染系统

  • 游戏渲染面临的挑战

    1. 渲染量大、算法复杂、all in one
    2. 对于不同硬件显卡的适配和优化
    3. 实时性(60fps、120fps)和分辨率(1080p、4K、8K)要求
    4. CPU带宽和内存限制(游戏逻辑、网络、动画物理等都是CPU处理的)
  • 这块是一个实践性、工程性知识(与纯理论相对),因此技术更新换代非常快

四个课时概览

在这里插入图片描述


一,渲染管线流程

流程参照101和图形基础

二,了解GPU

SIMD 和 SIMT

  • 单指令多数据SIMD(Single Instruction Multiple Data)运算,对多个数据同时进行同一种运算(指令级并行),一般用于矩阵计算
  • 单指令多线程SIMT(Single Instruction Multiple Threads)运算,多线程处理运算(相当于GPU多线程版SIMD),GPU的线程数是比CPU多得多,因此处理简单计算快

GPU 架构

  • GPU上的运算是分到一个个的流式多核处理器SM(Streaming Multiprocessor)里计算的,SM用于运行CUDA(并行处理器)。计算时不仅可以并行,相互间还可以交换数据(硬件加速),这是现代GPU最重要的架构
  • 最先进的引擎一直在更新,比如逐渐能够使用compute shader、mesh shader等等;以及一些优化比如Tile-Based,这些都跟硬件架构息息相关,如果能先了解下显卡硬件的工作原理,有助于学习这些后续知识~(艺术家也一样)
    在这里插入图片描述

CPU到GPU的数据传输

  • 现代引擎中一般绘制和逻辑是不同步的,但如果某帧绘制需要逻辑运算的数据时,就可能出现不同步的延迟。并且CPU与GPU之间的数据传输非常慢,因此默认原则:尽可能用CPU->GPU的单向传输,而不从GPU读取数据。
  • 缓存(Cache)效率在GPU中非常重要,如果计算时要加载数据不在缓存里,就会出现Cache miss(读取到时Cache miss)情况,这时候如果想去内存读取,甚至会花费一百多个时间周期,处理效率大大降低

GPU性能限制

  1. 内存瓶颈Memory Bounds
  2. 算术逻辑单元ALU Bounds
  3. 纹理贴图单元TMU(Texture Mapping Unit) Bound
  4. 带宽瓶颈BW(Bandwidth) Bound

三,可见性

Renderable可渲染对象

  • Mesh:储存每个点的位置、法线、uv、权重等和三角形的点索引
  • Materials:经典模型Phong Model、PBR Model等
  • Texture:有时候比材质还要重要
  • Shaders:shader在引擎中不算是源码,而是“数据”;shader graph连连看
  • SubMesh:Mesh根据材质不同分为不同子网格,即SubMesh

提高渲染效率

  • 多个模型的多个submesh重复了怎么提高效率呢?
    1. 可以建立一个资源池(Resource Pool),将同一种资源储存到统一的资源池中,并建立缓存;
    2. Instance(实例化)相当于先定义一个物体的Renderable,然后再将该数据实例化并渲染
    3. 游戏中相同材质的submesh,也可以把场景物体按照材质排序,把相同材质的物体group到一起,然后只需设置一次材质(减少GPU等待数据);再进一步GPU Barch Rendering可以在一次drawcall里一次性设置并渲染大量同材质物体

Visibility Culling 可见性裁剪

  • 基础原理是通过包围盒判断,优化用BVH Culling之类的算法(尤其是动态东西很多的时候)或者PVS思想。
  • PVS(Potential Visibility Set):先用BSP-tree将空间进行划分,每个小格子之间用Portal(传送门)连接,绘制时只绘制当前各自及其能看到的其他格子的内容即可(用于动态载入场景),并且每个格子的可见性是预设好的
  • 随着硬件升级,更多使用的是GPU Culling,用GPU快速计算出每个物体的包围盒是否可见,搭配preZ等技术

在这里插入图片描述

四,纹理压缩(Texture Compression)

常见的图片格式如JPG、PNG等都是一种压缩格式,它们压缩率高,但是无法实现随机访问,且算法复杂。而在引擎中的纹理需要有高效压缩和解压、随机访问、压缩率高质量好的特性,因此一般采用块压缩(Block Compression)的技术,比如bxt格式是把图片分为4X4的小格子,并且只记录像素最大最小值和各个像素在这两个值之间的插值。「相当于用64位表示原本需要384位(24*16)的16个像素:32位用565格式记录2个颜色,32位记录每个像素的索引,除两个像素颜色外只支持2种插值,共4种,用10的组合作为索引记录,其他颜色丢失」

  • 在PC上常用BC7(最新)和DXTC格式,手机上常用ASTC(最新)和ETC/PVRTC格式

在这里插入图片描述

五,Cluster-Based Mesh Pipeline

随着发展玩家在一个场景里对模型精度、细节要求越来越高,带来的GPU渲染负荷也增大,因此引擎侧逐渐向Cluster-Based Mesh Pipeline方向发展。

  • 管线核心思想:将非常精细的模型分为一个个的小Cluster,比如64个三角形分一个,然后以Cluster为单位进行渲染,剔除和深度排序也是基于Cluster bound而不是整个物体。(natine就是该思想拓展细分到像素级别)(想想曲面细分不就是一个三角形分成更多个然后统一渲染吗)这也对程序员提出了更高的要求。

总结

  • 游戏引擎的设计与硬件架构密不可分,要做好一个图形程序,就得了解显卡架构
  • 游戏引擎的一个核心问题是Mesh、Materials等数据之间的关系,submesh就是一个很好的解决方法
  • 大师:do nothing—用Culling算法使得引擎绘制尽可能少的东西,CPU、GPU做的事越少越好
  • GPU代替CPU计算–GPU Driven

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

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

相关文章

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策,NTFS与exFAT作为主流的文件系统,用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT,格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

网络基础:EIGRP

EIGRP(Enhanced Interior Gateway Routing Protocol)是由思科开发的一种高级距离矢量路由协议,结合了距离矢量和链路状态路由协议的优点;EIGRP具有快速收敛、高效带宽利用、负载均衡等特点,适用于各种规模的网络。EIGR…

面试题springboot面试

文章目录 Spring的依赖注入构造器注入stetter注入属性注入 springboot的优势第一开箱即用约定大于配置内嵌tomcat服务器 javaweb的三大组件springboot的自动配置原理SpringIoc的实现机制springmvcspring如何简化开发 Spring的依赖注入 构造器注入 stetter注入 属性注入 使用…

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…

环保管理新篇章:智慧环保引领制造业走向绿色未来

环保领域作为当代社会焦点之一,其重要性不言而喻,直接关系到人类生存环境的可持续发展,因此吸引了政府、企业及社会各界的深切关注。然而,在环保行业蓬勃发展的背后,亦浮现出一系列亟待解决的痛点:融资渠道…

PyTorch MNIST手写体识别:SwanLab可视化训练

MNIST手写体识别是深度学习、CV的“Hello World”,无数人从这个任务入门,进入深度学习的世界~ 进阶请看:PyTorch猫狗分类 这篇文章我将带大家使用SwanLab(训练可视化)、PyTorch(深度学习框架&…

Hive常用的内置函数

文章目录 聚合类1.指定列值的数目2.指定列值求和3.最大值4.最小值5.平均值6.中位数函数7.分位数函数 数值类1.取整函数Round(a)2.指定精度取整ROUND(double a,int b)3.向上取整FLOOR()4.向下取整CEIL()5.随机数 rand()6.绝对值函数 日期类获取当前日期获取当前时间戳日期前后日…

【Java环境配置过程详解(包括IDEA配置Java)】

目录 一、JDK下载安装 1. 官网下载JDK 2. 本地安装JDK 3. 配置环境变量 4. 验证是否安装成功 ​编辑二、IDEA进行安装下载 1. 官网下载 IDEA 2、IDEA进行Java开发 1. 创建Java项目 2. 程序测试 一、JDK下载安装 1. 官网下载JDK 1)官网链接: https://www.o…

IT行业入门,如何假期逆袭,实现抢跑

目录 前言 1.IT行业领域分类 2.基础课程预习指南 3.技术学习路线 4.学习资源推荐 结束语 前言 IT(信息技术)行业是一个非常广泛和多样化的领域,它包括了许多不同的专业领域和职业路径。如果要进军IT行业,我们应该要明确自己…

keyclock实现三方登录

公司希望我把公司的keycloak作为新项目的一种第三方登录方式时,就像微信,google,github,使用keycloak上的账户资源 因此,先需要跟公司keyclock管理员联系,让他把各个端点url,keycloak颁发的cli…

MATLAB将两个折线图画在一个图里

界面如图 输入行数和列数,点击开始填入数据,其中第一列为x值,后面几列,每一列都是y坐标值,填好后点击画在同一张图里即可。点击置零就把所有数变成0,另外也可以选择节点样式。 .mlapp格式的文件如下 夸克…

AI时代的产品经理的成长指南_pdca循环理论制定ai学习成长计划

一、人人不都是产品经理 大多数人听到“产品经理”这个词,总会联想到“人人都是产品经理”这句话。但实际上产品经理这个岗位并没有那么简单。 用一句话概括产品经理的职责就是“帮助团队交付正确产品给用户的人”。也就是说,产品经理要能凝聚团队的力…

归并排序-MergeSort (C语言详解)

目录 前言归并排序的思想归并排序的递归法归并排序的非递归法归并排序的时间复杂度与适用场景总结 前言 好久不见, 前面我们了解到了快速排序, 那么本篇旨在介绍另外一种排序, 它和快速排序的思想雷同, 但又有区别, 这就是归并排序, 如下图, 我们对比快速排序与归并排序. 本…

在线JSON可视化工具--改进

先前发布了JSON格式化可视化在线工具,提供图形化界面显示结构关系功能,并提供JSON快速格式化、JSON压缩、快捷复制、下载导出、对存在语法错误的地方能明确显示,而且还支持全屏,极大扩大视野区域。 在线JSON格式化可视化工具 但…

[Labview] 二维数组写入表格

就一个二维数组写表,CSDN天天让我改进质量 简直是迫害完美主义 天知道Labview有什么思路好写,就一个破连连看(ˉ▽ˉ;)... 随便写点什么碎碎念占字数好了

Linux源码阅读笔记09-进程NICE案例分析1

task_nice task_nice函数功能:获取某个进程的nice值,其中nice值为进程的优先级,与静态优先级有关(nicestatic_prio-120)。 nice的取值范围:-20 ~ 19 内核源码 根据内核的注释可以知道:task_n…

时间12小时和24时转换方法

24小时时间转为12小时制 function convertTo12Hour(time24h){let [hours, minutes] time24h.split(:);let modifier 上午;if (parseInt(hours, 10) > 12) {modifier 下午;hours (parseInt(hours, 10) - 12).toString();}if (parseInt(hours, 10) 12) {modifier 下午;}…

Arduino 与树莓派常用的 IMU 传感器

惯性测量单元(IMU)是一种高度集成的传感器系统,广泛应用于需要高精度运动和姿态信息的领域。某些高精度要求下,还需要辅以温度、气压等其他传感器信息。 一、组成与功能 1. 组成 9 轴 IMU 由三个主要部分组成:3 轴加…

系留无人机+自组网+单兵图传:低空集群组网指挥系统技术详解

低空无人机集群的控制、调度、信息回传需要有高度可靠和稳定的无线通信链路来保障。我国发达的公网基础设施为上述应用创造了良好的条件,但低空应用必须要考虑到在极端情况下公网瘫痪造成的通信链路中断带来的影响,因此有必要在公网之外,寻求…

C语言----文件操作

1.为什么使用文件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化…