GPU硬件如何实现光栅化?

news2024/9/24 8:04:04

版权声明

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 文章内容不得删减、修改、演绎
  • 本文视频版本:见文末

引言

大家好,我是老雷,今天我想从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代码?

参考

完整视频请点击本链接观看:https://www.bilibili.com/video/BV1gUWDe2ECU

技术交流请加v:alice17173

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

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

相关文章

JS防抖和节流函数

节流和防抖函数的定义 防抖:只有在最后一次事件发生后的一定时间间隔内没有新的事件触发时,才执行相应的处理函数。节流:在规定的时间间隔内最多只能执行一次相应的处理函数。 效果图 示例图 示例图运行结果如下: 代码 &l…

远程升级,你成功了吗?

最近又遇到了远程升级失败的情况,而且是不明原因的多次接连失败。。。 事情是这样的:最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试,发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况&#xf…

【深度学习】03-神经网络3-1梯度下降网络优化方法

每一条线是一个权重,每个神经元由一个加权和还有一个 激活函数组成。每一层可以理解是一个函数,最终形成一个复合函数,因此求梯度的时候,是一层一层的求解,所以叫做反向传播。 只会考虑当前数据之前的数据,…

潮玩宇宙大逃杀宝石游戏搭建开发

潮玩宇宙大逃杀的开发主要涉及以下方面: 1. 游戏概念和设计: 核心概念定义:确定以潮玩为主题的宇宙背景、游戏的基本规则和目标。例如,玩家在宇宙场景中参与大逃杀竞技,目标是成为最后存活的玩家。 玩法模式设计&a…

k8s上安装prometheus

一、下载对应的kube-prometheus源码 github地址:GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes 1)进入目录 [rootk8s-master ~]# cd kube-prometheus [rootk8s-master…

商城小程序源码搭建部署,商城购物小程序开发流程(php框架)

关于商城小程序 商城小程序作为一种基于移动互联网的在线购物平台,商家可以上架所销售的产品,定价,以及营运营的在线售货平台。买家无需下载应用,在小程序搜索打开即可浏览下单商品。 技术栈 前端: vue uniapp 后端&#xff1a…

嵌入式Linux学习笔记(7)-Socket网络编程

一、什么是Socket网络编程 Socket是一种抽象的编程接口,可以用于在不同主机之间进行数据通信。Socket API提供了一系列函数来创建、连接、发送和接收数据等操作。嵌入式 Linux 系统中的 Socket 网络编程是指在嵌入式系统中使用 Socket API 进行网络通信。 Socket 网…

HTTP协议1.1请求头和keep-alive

请求头分类 End-to-end(端对端) 必须全部带给目标服务器,不会被中途变化或去掉 Hop-by-hop(逐跳头) 比如客户端发请求,要路过代理(例如Nginx),头可以被自动删掉,来到真正服务器上…

vue/配置axios(前后端数据连通/api接口的调用)

1.创建apis文件 2.写入调用的api地址且暴露出去。 import httpInstance from /utils/http;export function getHomeNav() {return httpInstance({url: http://10.0.11.91:91/dailyreport/getdailyreportall,}) }3.创建文件编写拦截器 代码部分 //axios基础封装 import axio…

Thinkphp5x远程命令执行 靶场攻略

环境配置 靶场:vulhub/thinkphp/5-rce docker-compose up -d #启动环境 漏洞复现 1.访问靶场:http://172.16.1.198:8080/ 2.远程命令执⾏ POC: ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system…

Bytebase 2.23.0 - 支持 Entra (Azure AD) 用户/组同步

🚀 新功能 支持从 Entra ID(前 Azure AD)同步用户和群组。 支持 CockroachDB。 支持项目级别的默认备份设置,包含自动启用和跳过错误选项。 SQL 编辑器支持实时语法检查。 支持配置密码限制策略。 🔔 重大变更 分类…

初试AngularJS前端框架

文章目录 一、框架概述二、实例演示(一)创建网页(二)编写代码(三)浏览网页(四)运行结果 三、实战小结 一、框架概述 AngularJS 是一个由 Google 维护的开源前端 JavaScript 框架&am…

输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。

输电线塔目标检测数据集yolo格式 该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。 输电线塔目标检测数据集 数据集名称 输电线塔目标检测数据集(Transmission Tower Object Detecti…

从视觉到现实:掌握计算机视觉技术学习路线的十大步骤

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于【计算机视…

【第十五章:Sentosa_DSML社区版-机器学习之关联规则】

目录 15.1 频繁模式增长 15.2 PrefixSpan 【第十五章:Sentosa_DSML社区版-机器学习之关联规则】 机器学习关联规则是一种用于发现数据集中项之间有趣关系的方法。它基于统计和概率理论,通过分析大量数据来识别项之间的频繁共现模式。 15.1 频繁模式增…

Linux-DHCP服务器搭建

环境 服务端:192.168.85.136 客户端:192.168.85.138 1. DHCP工作原理 DHCP动态分配IP地址。 2. DHCP服务器安装 2.1前提准备 # systemctl disable --now firewalld // 关闭firewalld自启动 # setenforce 0 # vim /etc/selinux/config SELINU…

学生管理系统模块化编程

项目介绍:Java基础mysql的一个简单练习 一.数据库 二.项目结构 lib下的jar包下载地址:Maven Repository: mysql mysql-connector-java (mvnrepository.com) 1.db.properties drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/student?u…

【Unity3d Shader】毛玻璃效果

毛玻璃也叫​磨砂玻璃​:是用物理或化学方法处理过的一种表面粗糙不平整的半透明玻璃。 毛玻璃成像原理:毛玻璃表面不平整,光线通过毛玻璃被反射后向四面八方射出去(因为毛玻璃表面不是光滑的平面,使光产生了漫反射),折射到视网膜上已经是不完整的像,于是就看不清楚(…

基于OpenCV的单目测距

随着计算机视觉技术的发展,单目测距作为一种重要的视觉测量手段,在众多领域得到了广泛的应用。本文将探讨基于OpenCV的单目测距原理、局限性、实际应用场景以及一些优化方案。 单目测距的原理 单目测距是指利用一台摄像机拍摄到的单一图像来进行距离测量…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源,风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设,现有风机124台,总装机容量约20万千瓦。请建立数学模型,解决以下…