Your computer’s Central Processing Unit (CPU) and Graphics Processing Unit (GPU) interact every moment you’re using your computer to deliver you a crisp and resp***ive visual interface. Read on to better understand how they work together.
斯肯内尔摄。
今天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,它是一个由Q&a网站组成的社区驱动分组。
超级用户读者Sathya提出了一个问题:
在这里你可以看到一个小的C++程序的截图三角形.exe基于openglapi的旋转三角形。
诚然,这是一个非常基本的例子,但我认为它适用于其他图形卡操作。
我只是好奇,想知道双击的整个过程三角形.exe在windowsxp下,直到我能看到显示器上旋转的三角形。发生了什么,CPU(首先处理.exe)和GPU(最后输出屏幕上的三角形)是如何交互的?
我想显示这个旋转三角形主要涉及以下硬件/软件:
硬件
软件
有人能解释一下这个过程吗,也许可以用一些流程图来说明一下?
它不应该是一个涵盖每一个步骤的复杂解释(估计超出了范围),而是一个中级It人员可以遵循的解释。
我敢肯定,很多自称IT专业人士的人都无**确描述这个过程。
尽管有多名社区成员回答了这个问题,但奥利弗·萨尔茨堡(Oliver Salzburg)还是不遗余力地回答了这个问题,不仅给出了详细的回答,而且还附上了出色的图表。
JasonC提供的图片,可在此处作为墙纸使用。
他写道:
我决定写一点关于编程方面以及组件如何相互通信的内容。也许它能给某些领域带来一些启示。
哪怕是你在问题中发布的一张图片,也能画在屏幕上,这需要什么呢?
在屏幕上画三角形有很多方法。为简单起见,假设没有使用顶点缓冲区。(顶点缓冲区是存储坐标的内存区域)假设程序只是告诉图形处理管道一行中的每个顶点(顶点只是空间中的一个坐标)。
但是,在我们能画出任何东西之前,我们首先要运行一些脚手架。我们稍后再看原因:
// Clear The Screen And The Depth Buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset The Current Modelview Matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Drawing Using Triangles glBegin(GL_TRIANGLES); // Red glColor3f(1.0f,0.0f,0.0f); // Top Of Triangle (Front) glVertex3f( 0.0f, 1.0f, 0.0f); // Green glColor3f(0.0f,1.0f,0.0f); // Left Of Triangle (Front) glVertex3f(-1.0f,-1.0f, 1.0f); // Blue glColor3f(0.0f,0.0f,1.0f); // Right Of Triangle (Front) glVertex3f( 1.0f,-1.0f, 1.0f); // Done Drawing glEnd();当你编写一个程序,希望使用图形卡,你通常会选择某种接口的驱动程序。驱动程序的一些众所周知的接口包括:
对于这个例子,我们将使用OpenGL。现在,驱动程序接口为您提供了使程序与图形卡(或驱动程序,然后驱动程序与图形卡)对话所需的所有工具。
这个接口一定会给你一些工具。这些工具采用API的形式,您可以从程序中调用它。
这个API就是我们在上面的例子中看到的。让我们仔细看看。
在你真正绘制任何实际的图形之前,你必须先进行一次设置。您必须定义您的视口(实际渲染的区域)、您的透视图(相机进入您的世界)、您将使用什么样的抗锯齿(平滑三角形的边缘)…
但我们不会看这些。我们只看一眼你每一帧都要做的事情。比如:
清除屏幕
图形管道不会为您清除每一帧的屏幕。你得说出来。为什么?这就是为什么:
如果你不清除屏幕,你只需在每一帧上画。这就是为什么我们用gl\u COLOR\u BUFFER\u位集调用glClear。另一位(GL\u DEPTH\u BUFFER\u位)告诉OpenGL清除depthbuffer。此缓冲区用于确定哪些像素位于其他像素的前面(或后面)。
转变
Image source
变换是我们获取所有输入坐标(三角形的顶点)并应用ModelView矩阵的部分。这是解释模型(顶点)如何旋转、缩放和平移(移动)的矩阵。
接下来,我们应用投影矩阵。这会移动所有坐标,使它们正确面对我们的相机。
现在我们再次变换,使用我们的视口矩阵。我们这样做是为了将模型缩放到监视器的大小。现在我们有一组顶点可以渲染了!
我们稍后再谈转型。
绘图
为了绘制一个三角形,我们可以简单地告诉OpenGL通过调用glBegin with the GL\u triangles来开始一个新的三角形列表不变。在那里还有其他你可以画的形式。像三角带或三角扇子。这些主要是优化,因为它们需要较少的CPU和GPU之间的通信来绘制相同数量的三角形。
之后,我们可以提供一个由3个顶点组成的列表,这些顶点应该组成每个三角形。每个三角形使用3个坐标(就像我们在三维空间中一样)。此外,我还通过在调用glVertex3f之前调用glcolor3f,为每个顶点提供一种颜色。
3个顶点(三角形的3个角)之间的着色由OpenGla自动计算。它将在多边形的整个面上插值颜色。
现在,当你点击窗口。应用程序只需捕获发出单击信号的窗口消息。然后您可以在您的程序中运行任何您想要的操作。
一旦你想开始与你的3D场景交互,这就变得困难多了。
您首先必须清楚地知道用户单击窗口的像素。然后,考虑到你的视角,你可以计算光线的方向,从鼠标点击进入你的场景。然后可以计算场景中是否有任何对象与该光线相交。现在您知道用户是否单击了一个对象。
那么,如何使它旋转?
我知道通常应用的两种类型的转换:
区别在于骨骼影响单个顶点。矩阵总是以相同的方式影响所有绘制的顶点。让我们看一个例子。
例子
早些时候,我们在绘制三角形之前加载了单位矩阵。单位矩阵是一种根本不提供变换的矩阵。所以,无论我画什么,都只受我的视角影响。所以,三角形根本不会旋转。
如果我现在想旋转它,我可以自己(在CPU上)做数学运算,然后用其他坐标(旋转的)调用glVertex3f。或者我可以让GPU做所有的工作,在绘图前调用glrotatef:
// Rotate The Triangle On The Y axis glRotatef(amount,0.0f,1.0f,0.0f);当然,数量只是一个固定值。如果你想设置动画,你必须跟踪数量并每帧增加一次。
在这个简单的例子中,我们不必关心矩阵。我们简单地称之为glRotatef,它为我们处理所有这些。
glRotate produces a rotation of angle degrees around the vector x y z . The current matrix (seeglMatrixMode) is multiplied by a rotation matrix with the product replacing the current matrix, as ifglMultMatrix were called with the following matrix as its argument:
x 2 1 – c + c x y 1 – c – z s x z 1 – c + y s 0 y x 1 – c + z s y 2 1 – c + c y z 1 – c – x s 0 x z 1 – c – y s y z 1 – c + x s z 2 1 – c + c 0 0 0 0 1
好吧,谢谢你!
显而易见的是,OpenGL有很多话题。但它什么也没告诉我们。通讯在哪里?
OpenGL在这个例子中告诉我们的唯一一件事就是它何时完成。每次手术都需要一定的时间。有些手术需要很长的时间,有些手术很快。
发送一个顶点到GPU将是如此之快,我甚至不知道如何表达它。从CPU向GPU发送数千个顶点,每一帧,很可能根本没有问题。
清除屏幕可能需要毫秒或更糟的时间(请记住,绘制每一帧通常只有大约16毫秒的时间),具体取决于视口的大小。要清除它,OpenGL必须以你想要清除的颜色绘制每个像素,可能是数百万像素。
除此之外,我们几乎只能向OpenGL询问图形适配器的功能(最大分辨率、最大抗锯齿、最大颜色深度……)。
但我们也可以用像素填充纹理,每个像素都有特定的颜色。因此,每个像素都有一个值,纹理是一个巨大的“文件”,里面充满了数据。我们可以将其加载到图形卡(通过创建纹理缓冲区),然后加载一个着色器,告诉该着色器使用我们的纹理作为输入,并在“文件”上运行一些非常繁重的计算。
然后我们可以将计算结果(以新颜色的形式)渲染成新的纹理。
这就是你可以让GPU在其他方面为你工作的方式。我想CUDA在这方面也有类似的表现,但我从来没有机会与之合作。
我们真的只触及了整个主题。3D图形编程真是个怪兽。
Image Source
有什么要补充的解释吗?在评论中发出声音。想从其他精通技术的Stack Exchange用户那里了解更多答案吗?在这里查看完整的讨论主题。
...RAM(或VRAM,发音为“VEE-RAM”)是一种特殊类型的RAM,与计算机的图形处理单元(GPU)一起工作。 ...
基准测试是一个测试,或一系列测试,它决定了某个计算机硬件运行的好坏——在很多情况下,“基准测试”本质上是“压力测试”的同义词。通过将硬件推向极限,您可以将其测量值与其他硬件的测量值进行比较。 ...
... Sandra Lite是一个功能齐全的基准测试套件,面向非常了解计算机内部工作的用户,以及需要在多台计算机上执行详细分析的企业。 ...
...人们对这些神秘的内核赞不绝口,但你仍然不知道他们是如何改进GPU的。对你来说,它们只是让你想到海洋生物的东西。 ...
...Mac电脑在游戏和其他应用程序中渲染图形的速度。下面是如何检查你的Mac有哪个GPU。 首先,点击屏幕左上角的“Apple”菜单,选择“About This Mac” 在打开的“About This Mac”窗口中,您将看到略有不同的信息,具体取决于您的Mac是...
...两个图标:一个喷口(加力燃烧室)和一个带有“60”的计算机显示器(RivTuner统计服务器)。 现在,让我们为大秀做好准备。打开加力燃烧室,然后单击设置中心距。在出现的窗口中,单击“屏幕显示”。在“全局屏幕显示热...
...细信息”。 选择要在侧边栏中看到的性能图。您将看到计算机的CPU、内存、存储设备(包括SSD、硬盘和USB设备)、网络连接(有线以太网和Wi-Fi)和GPU(图形处理器)的选项 要仅显示性能图,请双击右窗格中某个图上的任意位...
googlechrome配备了硬件加速功能,这项功能可以利用计算机的GPU来加速进程并释放重要的CPU时间。但是,有时驱动程序不兼容会导致此功能出现错误,禁用此功能可以为您省去一些麻烦。 什么是硬件加速(hardware acceleration)? 硬...
...C游戏FPS(每秒帧数)的方法 通过更新驱动程序提高fps 为计算机的图形硬件(GPU)提供最新的图形驱动程序非常重要。像NVIDIA、AMD甚至Intel这样的图形处理器**商定期发布新版本的图形驱动程序,这些驱动程序经过优化,可以让...
...多都是免费的。 在执行任何基准测试之前,请确保您的计算机上没有运行任何其他程序。如果一个应用程序在后台运行,它会减慢基准测试的速度并扭曲结果。当你暂时不需要你的电脑的时候,计划运行你的基准测试,因为这...