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。此緩衝區用於確定哪些畫素位於其他畫素的前面(或後面)。
轉變
變換是我們獲取所有輸入座標(三角形的頂點)並應用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圖形程式設計真是個怪獸。
有什麼要補充的解釋嗎?在評論中發出聲音。想從其他精通技術的Stack Exchange使用者那裡瞭解更多答案嗎?在這裡檢視完整的討論主題。
... 7上,訪問“控制面板”>“程式和功能”。向下滾動以查詢條目,或使用右上角的搜尋框查詢條目。 ...
...技術實際上還沒有發展到那個程度。當我們在2012年探索如何讓您的計算機保持安靜時,常見的解決方案是: ...
...此,這幾乎是獲取定量資料的唯一方法,說明系統的效能如何——如果您的數字不足,這表明您可能希望升級一些PC元件。 ...
... 本文將重點討論什麼是意外的計算機崩潰以及如何識別問題。計算機崩潰的發生有多種原因。對於普通的PC使用者來說,PC崩潰通常被視為PC損壞或損壞的跡象。在現實中,PC機的關閉很少值得擔心。只要電腦沒有受到...
... 請閱讀我們關於如何像專業人士一樣進行基準測試的文章,瞭解如何準確地對元件進行基準測試。 ...
...人們對這些神祕的核心讚不絕口,但你仍然不知道他們是如何改進GPU的。對你來說,它們只是讓你想到海洋生物的東西。 ...
...魁禍首,最好的辦法是禁用它,看看是否解決了問題。 如何開啟或關閉硬體加速 預設情況下,硬體加速是在Chrome上啟用的,所以讓我們先看看禁用它。 啟動Chrome,單擊選單圖示,然後單擊“設定”。或者,您可以鍵入chrome://設...
...Windows7釋出以來,微軟已經極大地改進了工作管理員。 如何啟動工作管理員 Windows提供了許多啟動工作管理員的方法。按Ctrl+Shift+Esc以使用鍵盤快捷鍵開啟工作管理員,或右鍵單擊Windows工作列並選擇“工作管理員” 您也可以按...