图形学中一些基本知识的总结与复习

news2024/11/18 6:04:05

前言
在过完games101课程后仍然觉得自己还有许多地方不懂与遗漏,以此来补充与复习一些其中的知识。
参考:Games101、《Unity Shader 入门精要》

GPU渲染流水线(GPU Rendering Pipeline)

l流程图(来自知乎“拓荒犬”)
----注:Games101课程中所展示渲染流程与书中有所不同,大体相同,细节展示有所不同,这点请看图在这里插入图片描述

这里以《Unity Shader入门精要》中为主介绍,如下图:
在这里插入图片描述
补充:绿色表示完全可编程控制,黄色表示可以配置但不是可编程,蓝色表示由CPU固定实现。实线表示该Shader必须由开发者编程实现,虚线表示该Shader是可选的。

----------------------下面说明各阶段:

Application(应用阶段):

渲染流水线的起点是CPU,即应用阶段。应用阶段大致可分为以下3个阶段:
(1)把数据加载到显存中
(2)设置渲染状态
(3)调用Draw Call

> 把数据加载到显存中:
渲染所需要的数据需要从硬盘传输到系统内存中(RAM),网格和纹理等数据被加载到显存中。(真实渲染中需要加载到显存中的数据还有顶点的位置信息、法线方向、顶点颜色、纹理坐标等)。
> 设置渲染状态:
渲染状态可以理解为场景中的网格是怎样被渲染的,即使用哪个顶点着色器/片元着色器、光源属性、材质等。如果没有更改渲染状态的话那么所有网格都将使用同一种渲染状态。
下图为同一状态下渲染3个网格。
在这里插入图片描述
接下来,就是调用Draw Call啦!

> 调用Draw Call:
其实Draw Call本质上就是一个命令,它的发起方是CPU,接收方是GPU。当我们给定了一个Draw Call时,GPU就会根据渲染状态(例如材质、纹理、着色器等)和所有输入的顶点数据来进行计算。

----------关于Draw Call的一些补充----------
Draw Call本身的含义很简单,就是CPU调用图像编程接口,入OpenGL中的glDrawElements命令。有一个常见的误区时Draw Call中造成性能问题的元凶时GPU,认为GPU上的状态切换是耗时的,其实真正“拖后腿”的是CPU
问题一:CPU和GPU是如何实现并行工作的?
若没有流水线化,则CPU需要等GPU完成上一个渲染任务才能再次发送渲染命令,这导致效率低下。而解决方法就是使用一个“命令缓冲区
命令缓冲区包含了一个命令队列,CPU向其中添加命令,GPU从中读取命令,CPU与GPU互不干扰。如下图:
在这里插入图片描述
(黄色方框内的命令就是Draw Call,而红色方框内的命令用于改变渲染状态。使用红色方框来表示改变渲染状态的命令,是因为这些命令往往更加耗时)

问题二:为什么Draw Call多了会影响帧率
在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。当CPU完成这些准备工作之后GPU就可以开始本次渲染了。但是由于GPU的渲染能力很强,会导致GPU的渲染速度大于CPU提交命令的速度。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call上,造成CPU的过载。如下图:
在这里插入图片描述
(虚线框表示GPU已经完成的命令。此时命令缓冲区已没有可执行的命令,GPU处于空闲状态,而CPU还没有准备好下一个渲染命令。)

问题三:如何减少Draw Call
这里仅提一种方法,叫做“批处理” 方法。
提交大量很小的Draw Call会造成CPU的性能瓶颈,即CPU把时间都花费在准备Draw Call的工作上了。批处理的思想是把很多小的Draw Call合并成一个大的Draw Call。 (批处理技术更适合于那些静态的物体。)

Geometry Processing(几何阶段):

几何阶段又细分为以下几个阶段:
(1)顶点着色器
(2)曲面细分着色器
(3)几何着色器
(4)裁剪
(5)屏幕映射

>顶点着色器:
顶点着色器(Vertex Shader)是完全可编程的,顶点着色器本身不可以创建或者销毁任何顶点,而且无法得到顶点与顶点之间的关系。顶点着色器的主要工作:坐标变换和逐顶点光照。如下图在这里插入图片描述

  • 坐标变换:在顶点着色器中完成MVP变换,把顶点坐标从模型空间转换到齐次裁剪空间。接着通常再由硬件做透视除法,最终得到NDC。

>曲面细分着色器:
一个可选着色器,用于细分图元。

>几何着色器:
一个可选着色器,用于逐图元的着色操作,或者用于产生更多的图元。

>裁剪:
裁剪提出的目的是要为了处理掉那些不在摄像机视野范围内的物体。由于我们已知在NDC下的顶点位置,即顶点位置在一个立方体内,则只需要将图元裁剪到单位立方体内,如下图
在这里插入图片描述
图片补充:和单位立方体相交的图元会被裁剪,新的顶点会被生成,原来在外部的顶点会被舍弃。

>屏幕映射:
屏幕映射的任务是把每个图元的x和y坐标转换到屏幕坐标系下。这个过程实际是一个缩放的过程,但是屏幕映射不会对输入的z坐标做任何处理。过程如下图:
在这里插入图片描述
一些补充:在OpenGL中,屏幕左下角为最小的窗口坐标值,在DirectX中,屏幕的左上角为最小的窗口坐标值。

Rasterization(光栅化阶段):

光栅化阶段细分为以下几个阶段:
(1)三角形设置
(2)三角形遍历
(3)片元着色器
(4)逐片元操作

>三角形设置:
这是光栅化的第一个流水线阶段。上一个阶段输出的都是三角网格的顶点,为了得到整个三角网格对像素的覆盖情况,我们还需计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。

>三角形遍历:
这个阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖,则生成一个片元。这个阶段也被称为扫描变换
这一阶段还会根据三角网格3个顶点信息对整个覆盖区域的像素进行插值(利用重心坐标)。如下图(一个简化的计算过程):
在这里插入图片描述
这一步的输出得到一个片元序列。但是一个片元并不是真正意义上的像素,而是包含了很多状态的集合,用于计算每个像素的最终颜色。

>片元着色器:
片元着色器(Fragment Shader)是另一个可编程着色器阶段,又叫做像素着色器(Pixel Shader)。片元着色器的输入是上一个阶段对顶点信息插值得到的结果,而它的输出是一个或者多个颜色值。
前面的光栅化戒定慧产生一系列的数据信息,用来表述一个三角网格是怎天覆盖每个像素的。而每个片元就负责存储这样一系列数据。
如下图:
在这里插入图片描述
这一阶段可以完成许多重要的渲染技术如纹理采样。
局限:它仅可以影响单个片元,当执行片元着色器时,它不可以将自己的任何结果直接发送给它的邻居们。

>逐片元操作:
这是真正会对像素产生影响的一个流水线阶段。
这一阶段会有几个主要任务
<1>进行测试工作,如深度测试、模板测试等。
<2>如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者说是混合。下图是简化后的逐片元操作所做的操作。
在这里插入图片描述

在逐片元操作中的后面的合并操作时,对于不透明物体,开发者可以关闭**混合(Blend)**操作。这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区的像素值。对于半透明物体,就需要使用混合操作来让这个物体看起来是透明的。


《Unity Shader入门精要》中前面部分对渲染管线的介绍到此结束。下面是一些额外补充:

  1. 不同的文章对渲染管线的阶段分配介绍各有不同,清楚大体过程即可。
  2. 系统为了避免我们看到那些正在进行光栅化的图元,GPU会使用双重缓冲(Double Buffering)也就是说,对场景的渲染发生在幕后,即后置缓冲(Back Buffering)中。一旦场景已经被渲染到了后置缓冲中,GPU就会交换后置缓冲和前置缓冲(Front Buffering)
  3. 鉴于自己总是弄混顶点着色器的作用,在此再次总结一下:顶点着色器中完成MVP变换将顶点变换至齐次裁剪空间中,再由硬件做透视除法得到NDC。接着再由系统做裁剪以及屏幕映射。

下面再放上一些在Games101中渲染管线的图方便作对比:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写在最后:尽管写了不少,中间仍然可能会出现错误,后面继续学习发现错误后加以改正。
初次写于2023.10.7

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

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

相关文章

前端作业(17)

之后的20个作业&#xff0c;学自【20个JavaScript经典案例-哔哩哔哩】 https://b23.tv/kVj1P5f 支付倒计时 1. 支付10s倒计时 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compat…

【UE】在游戏运行时,通过选择uasset来生成静态网格体

目录 主要流程 步骤 一、创建用于包含静态网格体的Actor蓝图 二、按钮点击事件 效果 主要流程 用户点击按钮后产生一个文件对话框&#xff0c;用户通过文件对话框选择指定的文件夹&#xff0c;我们获取到这个文件夹路径后处理成“按路径获取资产”节点所需的输入&#x…

AdaBoost(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

录音编辑软件推荐,让你的音频制作更上一层楼!

“有没有好用的录音编辑软件推荐呀&#xff1f;就是可以用来剪辑录音的&#xff0c;领导要求我们对基层工作人员进行访谈&#xff0c;需要录音&#xff0c;可是录制的声音杂音很多&#xff0c;听不清在讲什么&#xff0c;求大家推荐一个录音编辑软件&#xff0c;谢谢啦&#xf…

更新SQLite数据库数据

本文所有代码均存放于 https://github.com/MADMAX110/Starbuzz 之前了解了如何修改应用让它从SQLite数据库中提取数据&#xff0c;但是还没有用过更新过数据库数据。 这里要修改应用使用户能够记录哪些饮料是他们的最爱。为此要为DrinkActivity增加一个复选框&#xff1b; 如果…

iPhone苹果手机闹钟智能跳过节假日怎么设置?

国内绝大多数的手机用户使用的操作系统只有三个&#xff0c;安卓、鸿蒙和苹果的ios。而iPhone苹果手机的忠实用户是非常多的&#xff0c;所以日积月累中用户数量也就非常庞大&#xff0c;并且相当一部分用户都是上班族。而工作忙碌的上班族因为事情比较多&#xff0c;为了避免自…

前端笔试题总结,带答案和解析(持续更新,上次更新23/10/5,目前有30题)

前端笔试题总结&#xff0c;带答案和解析&#xff08;持续更新&#xff0c;上次更新23/10/5&#xff0c;目前有30题&#xff09; 这个系列将持续更新前端笔试题一期十题&#xff0c;每五题做一个标题&#xff08;方便跳转&#xff09;&#xff0c;您可以一期一期阅读&#xff0…

SAP BAPI2017_GOODSMVT_CREATE 不支持 货物移动失败

SAP BAPI2017_GOODSMVT_CREATE 不支持 货物移动失败 可能的原因两种&#xff1a; 1.移动类型允许的事务代码不全 2.BAPI传值的移动类型有问题

Laya3.0 如何快速调试

点击play箭头 点击右边的开发者工具 就会弹出 chrome的调试窗口 然后定位到你自己的ts文件 直接在ts里断点即可 不需要js文件 如何自动生成代码&#xff1f; 比如你打开一个新项目 里面显示的是当前场景 只需要点击 UI运行时 右边的框就可以了 他会自动弹窗提示你 创建一个文…

百元内挂耳式耳机哪款好、百元挂耳式耳机推荐

开放式耳机采用挂耳式设计&#xff0c;佩戴不需要堵住耳道&#xff0c;这种创新的设计不仅可以享受音乐&#xff0c;还保留了外界环境的听觉感知能力&#xff0c;让我们在户外运动、通勤或进行其他活动时更加安全&#xff0c;预算不多&#xff0c;百元价位范围内&#xff0c;我…

Spring:处理@Autowired和@Value注解的BeanPostProcessor

AutowiredAnnotationBeanPostProcessor,它实现了MergedBeanDefinitionPostProcessor,因此会调用postProcessMergedBeanDefinition方法。 它实现了InstantiationAwareBeanPostProcessor,因此在属性注入时会调用postProcessPropertyValues方法 如果Autowired注解按类型找到了大…

微信如何防止被限制?一文了解原因和处理方法

微信引流频繁被限制加好友&#xff0c;是许多人在营销过程中遇到的一大难题。为了解决这一问题&#xff0c;我们需要先了解微信官方对好友添加的限制和政策。只有明确了这些规定&#xff0c;才能更有效地进行微信引流&#xff0c;提高营销效果。 为什么被限制&#xff1f; 为了…

为什么企业都在申报“高新技术”?有以下十大好处!

随着信息技术时代的迅速发展&#xff0c;很多企业为了能够在同行中脱颖而出&#xff0c;都会选择办理一些和企业相关的资质证书&#xff0c;以便提升企业的核心竞争力&#xff0c;今天同邦信息科技的小编就告诉大家为什么那么多企业都选择申报“高新技术”企业&#xff1f; 首先…

智慧用电安全云监控系统

近年来&#xff0c;我国电气火灾频发&#xff0c;2017年至2019年&#xff0c;我国共之间发生发展电气控制火灾31.1万起&#xff0c;占全国进行火灾总量及伤亡风险损失的30&#xff05;以上&#xff0c;2019年全年共接报火灾23.3万起&#xff0c;电气火灾11.1万&#xff0c;占52…

Doris 2.0.1 DockerFile版 升级实战

1、Doris 2.0.1 DockerFile 的制作 参考 Doris 2.0.1 Dockerfile制作-CSDN博客 2、之前的Doris 集群通过 Docker容器进行的部署&#xff0c;需提前准备好Doris2.0.1的镜像包 参考&#xff1a; 集群升级 - Apache Doris Doris 升级请遵守不要跨两个及以上关键节点版本升级的…

数字化转型频频失败?一体化模式提供新的思考

数字化连续6年出现在政府报告中&#xff0c;从《中小企业数字化赋能专项行动方案》到《关于推进“上云用数赋智”行动》、《“十四五” 规划和 2035 年远景目标建议》、《中小企业数字化转型指南》&#xff0c;再到2023年2月《数字中国建设整体布局规划》&#xff0c;加快数字化…

新基建智慧铁路:高铁沿线综合视频监控及风险智能预警管理方案

一 、方案背景 铁路沿线安全环境直接关系铁路运输安全畅通。随着我国铁路特别是高速铁路运营里程不断增加&#xff0c;改善铁路沿线安全环境对保障铁路高质量发展和人民群众生命财产安全的作用更加突出。为了保障高铁的安全运营&#xff0c;高铁对安防尤其是视频监控的需求不断…

【转载】vscode配置numpy环境,实测有效

1.首先找到python.exe文件的位置 查看python.exe文件在哪的方法&#xff1a; 1、在vscode中执行下面的程序即可直接输出python.exe文件的路径 import sys sys.executable 输出结果如下&#xff1a; 2、新建终端 然后输入下列进行跳转 cd C:\Users\胡萝卜超爱兔子\AppData\Lo…

【EI会议征稿】第三届公共管理与大数据分析国际学术会议 (PMBDA 2023)

第三届公共管理与大数据分析国际学术会议 &#xff08;PMBDA 2023&#xff09; 2023 3rd International Conference on Public Management and Big Data Analysis 第三届公共管理与大数据分析国际学术会议 &#xff08;PMBDA 2023&#xff09;将于2023年12月15-17日在中国南京…

c#访问sql server数据库登录失败

以下配置适用于如下情况&#xff1a;已经能连接数据库的server&#xff0c;而且用户名、密码都对&#xff0c;但通过c#访问数据库时出错&#xff0c;提示login、管道相关的错误。通过一些配置&#xff0c;最终解决了该问题&#xff0c;遇到该问题的小伙伴也可以按照同样配置尝试…