您已經提出了一個非常廣泛和複雜的問題。其實,你問幾個廣泛,複雜的問題。
對任何硬件的操作進行最終管理的軟件稱爲硬件的「驅動程序」。當然,對於圖形硬件,這被稱爲「圖形驅動程序」。像所有驅動程序一樣,圖形驅動程序實際上是OS的可安裝部分;操作系統是圖形驅動程序能夠完成工作並與硬件通信的原因。這兩項工作攜手共進。
有效的兩種D3D或OpenGL(以前稱爲「API」)調用:那些與驅動程序交談和那些沒有。實際吸引某些東西的每個呼叫都需要(最終)與驅動程序通話,但稍後設置的呼叫可能只是在本地存儲數據。
當您進行繪圖調用時,API會執行一些檢查以確保您作爲用戶進行了有效的呈現調用。如果是這樣,那麼API可以選擇做什麼。事實證明,直接與司機談話需要很長時間,不管你開始說話時你給了多少指令。因此,經常發生的事情是,API會存儲您的呈現調用並立即返回。然後,可能在另一個線程中,它可能會查看已存儲多少個呈現調用。如果有「足夠」,那麼它會將它們轉發給駕駛員。這被稱爲「編組」。
驅動程序的工作是將這些已轉發的調用轉換成GPU將執行的內容。
在同一行上,圖形管道在哪裏定義?在GPU硬件,驅動程序或軟件庫中?
這些日子實際上是一個非常棘手的問題,並且每一代硬件都變得更加棘手。
在過去,圖形管道的構建是由GPU硬件嚴格控制的。這些日子,這是不太正確的,雖然有一些硬件控制。在現代硬件上(能夠使用OpenGL 3.0或Direct3D10或更高版本),如果您可以直接訪問圖形驅動程序,則理論上可以設計使用某種圖形管道版本的API。所以這些API決定了圖形管道看起來像什麼。
渲染流水線中的每個階段都將寶貴階段的某些值作爲輸入,並生成一些數值作爲輸出。如果用於從輸入生成輸出的機制涉及執行用戶提供的程序(稱爲「着色器」),則該階段是「可編程的」。所以沒有可編程管線(還)的東西;只是一個固定管道的可編程階段。
非常感謝。我很清楚我的問題有多廣泛......對此抱歉,但感謝您花時間給我一個很好的答案。它澄清了很多事情。如果我的判斷正確,那麼API會驗證呼叫,將它們分組並最終通過發送累積呼叫的系統調用來調用驅動程序。這是否會調用驅動程序看起來更像彙編,高級別direct3d/opengl命令還是兩者都不? – cloudraven 2011-06-15 07:26:12
驅動程序只是操作系統加載的.dll或其他形式的庫。它只是普通的代碼,它像普通的代碼一樣獲得函數調用。什麼傳遞給驅動程序的數據結構看起來就是依賴於實現(它甚至會改變同一操作系統上的驅動程序),並且最終對於沒有實際編寫驅動程序的任何人都無關緊要。 – 2011-06-15 07:35:53
對不起,我這麼晚了,但後續的問題:API(OpenGL或DirectX)如何知道如何與所有不同的驅動程序交談?有Nvidia驅動程序,AMD/ATI驅動程序,以及每個驅動程序的許多版本?應用程序鏈接到一個設定版本的例如OpenGL,所以如果我更新我的驅動程序,OpenGL的舊版本如何知道如何與我的驅動程序交談?驅動程序和OpenGL之間的協調工作如何? – pomeroy 2014-05-01 15:35:51