GPU硬件如何实现光栅化?
版权声明
- 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
- 文章内容不得删减、修改、演绎
- 本文视频版本:见文末
引言
大家好,我是老雷,今天我想从GPU硬件原理出发,给大家分享在图形渲染流水线中,光栅化步骤的硬件原理,从而帮助大家更好的理解图形学的底层原理以及渲染优化的底层逻辑。
好,废话不多说,我们先来整体看一下渲染流水线,以及光栅化在渲染流水线中的位置和作用。
图形渲染流水线

光栅化,英文Rasterization,是图形渲染流水线中非常重要的一个步骤,它位于顶点计算之后,像素着色之前,目的就是把顶点构成的三角形映射到屏幕的一个个像素点上。
但是在一个游戏场景中,光栅化的压力是很大的。
我们知道,游戏场景是由很多游戏元素构成,例如:玩家、怪物、宠物、道具、地形、植被、树木、房子等等,这些模型少则几十、几百个三角面,多则几千、上万个三角面,每个三角面在经过光栅化以后,又会被填充到多个屏幕像素上,
因此光栅化的开销很大!
但是不用怕,我们的GPU就是为大规模计算而生的,那么GPU是如何做到快速的光栅化计算的呢?
这就需要掌握一些GPU底层的知识了。下面我将带着你一步一步揭开光栅化的底层面纱~
GPU架构

先看这幅图:这是我们的GPU,它由显存和许多计算单元组成。
显存(Global Memory)主要指的是在GPU主板上的DRAM,类似于CPU的内存,特点是容量大但是速度慢,CPU和GPU都可以访问。
计算单元通常是指SM(Stream Multiprocessor,流多处理器),这些SM在不同的显卡上组织方式还不太一样。作为执行计算的单元,其内部还有自己的控制模块、寄存器、缓存、指令流水线等部件。
GPC

GPU包含若干个GPC(它是Graphics Processing Cluster,图形处理簇的缩写)
不同架构的GPU包含的GPC数量不一样。以Maxwell架构为例,它是由4个GPC组成
SM

Maxwell的1个GPC有4个SM

不过这不是我们本次分享的重点,大家要重点关注的是GPC里连接各个SM计算单元的光栅化引擎(Raster Engine)。另外,连接每个GPC靠的是Crossbar,例如某一个GPC计算完的数据需要另外GPC来处理,这个分配就是靠的Crossbar。
光栅化跟GPU硬件的关系

再回到我们的问题:那么光栅化跟上面的硬件有什么具体关系呢?
首先,为了平衡光栅化的负载压力,Crossbar会根据一定策略,将屏幕划分成多个区域块,并重新分配给每一个GPC。这是Crossbar为屏幕划分区域块的示意图。
这里GPC接收到分配的区域后,就交给光栅化引擎来负责这些三角形像素信息的生成。同时还会处理其他的一些渲染流水线步骤,包括:三角形裁剪、背面剔除以及Early-Z(相关知识可以参考我的TA全栈项目)。
GPU架构和渲染管线

接下来光栅化引擎将将Vertex Shader计算后存放在L1和L2缓存里面的数据加载出来

将插值好的数据转交给PolyMorph Engine的Attribute Setup模块

经过插值的数据填充到Pixel Shader的寄存器里,供SM的运算核心做像素计算的时候使用
上面提到Crossbar会根据一定策略划分区域块,实际上的划分可能比上图更加复杂,我们来看一个实验
实验:渲染SM_ID

那么问题来了:
如果给每个SM分配一个[0,SM_COUNT-1]的WARP_ID
并将每个像素根据SM_ID渲染为不同亮度的红色:SM_ID / (SM_COUNT-1),
你认为会得到什么渲染结果呢?(图中的绿色暂时忽略)
这里我们以Geforce1080为例,它有20个SM,如果我们用不同亮度的红色表示不同的线程ID,并且渲染由两个三角形构成的四边形面片,就会得到这样的像素块效果。
在这里有几点值得注意:
第一,图中有20个亮度色阶,说明有20个不同编号的SM
第二,像素颜色不是连续变化的,说明SM的划分并不是按编号顺序简单地依次划分,而是由Crossbar重组后被光栅化器调度执行的
第三,同一个色块内的像素如果分属不同三角形,就会分给不同的SM进行处理。如果三角形越细碎,分配SM的次数就会越多,调度开销越大。
第四,这里一个色块是8×8,也就说明一个SM里运行了256个线程束
那么,什么是线程束呢?
什么是线程束

线程束英文WARP,为了和线程数加以区分,在容易产生歧义的地方,我们统一用英文WARP,而不用中文术语(线程束)
那么光栅化以后的像素是如何被并行计算(也就是逐像素渲染)的呢?
在逻辑上,一个线程执行一个Pixel Shader的核心函数,也就是一个线程处理一个像素。
GPU将屏幕分成一个一个的2×2的像素块,因为逻辑上一个Warp包含了32个线程,也就是说一个Warp处理的是8个像素块,这就解释了为什么上面我们看到的色块是8*8的。
思考:如果渲染WARP_ID…

同理,我们再以WARP_ID渲染为例,你认为如果将每个像素根据SM_ID渲染为不同亮度的红色,会得到什么结果?
大家可以思考一下
思考题答案以及代码片段请回复“光栅化”获取
我是优梦创客的老雷,一个14年经验的游戏公司主程和引擎架构师,同时也是一位爱分享的游戏开发技术UP主
我会保持更新每月不少于2集、每年不少于26小时的干货视频
也欢迎你保持关注,以获取我的最新更新
当然,我也准备了几百个小时的技术美术教程分享,欢迎了解
小结

最后,我们对今天的分享做一个小结。今天我们:
- 了解了光栅化在图形渲染流水线中的地位和作用
- 知道了GPU、GPC、SM的关系
- 也知道了SM、Warp、Thread的关系
- 并且通过实践理解了光栅化在GPU中是如何被调度的
进阶

这里还有一些可以进阶学习的知识点,在这里列出,供同学们参考:
GPU如何处理像素运算?
在输出到渲染目标前,GPU还会做哪些事情?
移动平台的GPU跟桌面端有哪些不同?
如何针对移动端GPU做优化?
CPU和GPU在计算上有什么本质区别?
如何编写高效能Shader代码?
相关文章:
GPU硬件如何实现光栅化?
版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本:见文末 引言 大家好,我是老雷,今天我想从GPU硬件原理出发,给大家分享在图形渲…...
Python写入文件内容:从入门到精通
在日常编程工作中,我们常常会遇到需要将数据保存至磁盘的需求。无论是日志记录、配置文件管理还是数据持久化,掌握如何有效地使用Python来写入文件内容都是必不可少的一项技能。本文将从基础语法开始,逐步深入探讨Python中写入文件内容的各种…...
相亲交易系统源码详解与开发指南
随着互联网技术的发展,越来越多的传统行业开始寻求线上转型,其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求,因此,开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…...
Golang | Leetcode Golang题解之第413题等差数列划分
题目: 题解: func numberOfArithmeticSlices(nums []int) (ans int) {n : len(nums)if n 1 {return}d, t : nums[0]-nums[1], 0// 因为等差数列的长度至少为 3,所以可以从 i2 开始枚举for i : 2; i < n; i {if nums[i-1]-nums[i] d {t}…...
汽车总线之----FlexRay总线
Introduction 随着汽车智能化发展,车辆开发的ECU数量不断增加,人们对汽车系统的各个性能方面提出了更高的需求,比如更多的数据交互,更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性,像ABS防抱死系统&a…...
前端代替后端做分页操作
如果后端没有分页api,前端如何做分页一、使用computed 这个变量应该是计算之后的值,是一个状态管理变量,跟onMounted类似import {computed} from vue // 定义ref储存rolelist,这里是原始数据 const roleList ref([])// 定义页码…...
L3 逻辑回归
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 在周将使用 LogisticRegression 函数对经典的鸢尾花 (Iris) 数据集进行分类。将详细介绍逻辑回归的数学原理。 1. 逻辑回归的数学原理 逻辑回归是一种线性分…...
Flink系列知识之:Checkpoint原理
Flink系列知识之:Checkpoint原理 在介绍checkpoint的执行流程之前,需要先明白Flink中状态的存储机制,因为状态对于检查点的持续备份至关重要。 State Backends分类 下图显示了Flink中三个内置的状态存储种类。MemoryStateBackend和FsState…...
智算中心动环监控:构建高效、安全的数字基础设施@卓振思众
在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…...
PyTorch VGG16手写数字识别教程
手写数字识别教程:使用PyTorch和VGG16 1. 环境准备 确保你已安装以下库: pip install torch torchvision2. 导入必要的库 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms import tor…...
安卓13删除下拉栏中的设置按钮 android13删除设置按钮
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。也就是下面这个按钮。 2.问题分析…...
FDA辅料数据库在线免费查询-药用辅料
在药物制剂的研制过程中,需要确定这些药用辅料的安全用量。而美国食品药品监督管理局(FDA)的辅料数据库(IID)提供了其制剂研发中的关键参考资源,使得更多的医药研发相关人员及企业单位节省试验环节及时间成…...
git pull 报错 refusing to merge unrelated histories
这个对我来说非常常见,因为我都是先由本地项目,再想着传到github上去。 在本地项目中执行 git init git add . git commit -m “xxx” 在github上创建项目,添加了 README.md 文件。 git remote add origin https://github.com/raoxiaoya/x…...
STM32G431RBT6(蓝桥杯)串口(发送)
一、基础配置 (1) PA9和PA10就是串口对应在单片机上的端口 注意:一定要先选择PA9的TX和PA10的RX,再去打开异步的模式 (2) 二、查看单片机的端口连接至电脑的哪里 (1)此电脑->右击属性 (2)找到端…...
使用 typed-rest-client 进行 REST API 调用
typed-rest-client 是一个用于 Node.js 的库,它提供了一种类型安全的方式来与 RESTful API 进行交互。其主要功能包括: 安装 typed-rest-client 要使用 typed-rest-client,首先需要安装它,可以通过 npm 来安装: $ n…...
在Ubuntu 14.04上安装Solr的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Solr 是基于 Apache Lucene 的搜索引擎平台。它用 Java 编写,并使用 Lucene 库来实现索引。可以通过各种 REST API&am…...
LabVIEW提高开发效率技巧----使用LabVIEW工具
LabVIEW为开发者提供了多种工具和功能,不仅提高工作效率,还能确保项目的质量和可维护性。以下详细介绍几种关键工具,并结合实际案例说明它们的应用。 1. VI Analyzer:自动检查代码质量 VI Analyzer 是LabVIEW提供的一款强大的工…...
Pyspark dataframe基本内置方法(4)
文章目录 Pyspark sql DataFrame相关文章RDDrepartition 重新分区replace 替换sameSemantics dataframe是否相等sample 采样sampleBy 分层采样schema 显示dataframe结构select 查询selectExpr 查询semanticHash 获取哈希值show 展示dataframesort 排序sortWithinPartitions 分区…...
配置win10开电脑时显示可登录账号策略
有1台公用的windows10电脑,电脑上有N多用户,使用人员登录时选择相应的账号登录即可。但在某次使用脚本加固后,发现之前显示的用户都不能显示了。检查加固脚本,是脚本启用了“交互式登录:不显示上次登录”策略。因此&am…...
01-Mac OS系统如何下载安装Python解释器
目录 Mac安装Python的教程 mac下载并安装python解释器 如何下载和安装最新的python解释器 访问python.org(受国内网速的影响,访问速度会比较慢,不过也可以去我博客的资源下载) 打开历史发布版本页面 进入下载页 鼠标拖到页面…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
