可編程渲染管線中有哪些功能是由硬體電路實現的?
1.除了統一著色器外,管線中的其他功能是由硬體電路實現的,還是由驅動編程實現的?2.看過其他的資料,現在的GPU主要由流處理單元+光柵單元+紋理單元組成。那像裁剪,圖元組裝,混合這些功能都是由流處理單元編程實現的么?3.紋理單元的作用是什麼? (猜測:壓縮紋理的解碼,紋理線性插值?)
4.PowerVR中一個pipeline的執行流程是怎麼樣的?是1個pipeline執行渲染管線中的一個子任務,如頂點著色或像素著色,多個pipe並發。還是1個pipeline本身就完成了一整個渲染管線?
我給文刀和Xinzhao的答案點了贊,不過xinzhao的答案問題相對多一點。
常規內容已經說完了,額外補充幾句文不對題的:1.
軟體和硬體並沒有那麼涇渭分明。如果類比做代碼,硬體就相當於將一些函數什麼的都展開成語句執行;軟體就相當於把可以共用的ALU/FPU/其他邏輯電路硬體封裝成「函數」,這些「函數」被控制電路所共享,然後由指令去指揮控制電路調用那些「電路」。所以「硬體」和「軟體」的區別之一,就是復用程度。軟體的復用更細(比如到指令一級),而硬體的復用要更大一些(功能級別的)。因為GPU也是要靠Micro Code和Data才能工作的,所以整個GPU就相當於是個大的、執行GPU Micro Code的CPU。
當然,因為有流水線的存在,所以電路相當於是用面積來換吞吐量(速度),可以獲得比一般軟體更高的速度。2.
個人設備上的GPU幾乎已經沒有非Unified的架構了,包括Mobile GPU。3.
邏輯上紋理單元一般包括 紋理存儲(Cache或Buffer)、紋理定址、地址計算、編解碼、過濾 等一系列功能。可以認為 tex2d(x, y) 這條指令整個都是由紋理單元完成的。當然實際晶元中,紋理採樣的每一個步驟,比如ddx/ddy的求解、紋理壓縮格式的編解碼器、雙線/三線/各向異性過濾,都可能會隨著設計的變化而變化,可以選擇在紋理單元內實現、可以選擇紋理單元外的獨立單元、甚至可以選擇軟體實現。https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/ 有人翻譯了部分(圖形學管線之旅),但強烈建議看英文
這個系列教程,雖然不是官方也不是最新,但是依然很有意義、值得推薦... 將管線中的很多部分從硬體部分進行分析,講述的就是the D3D/OpenGL graphics pipelines as actually implemented by GPUs
可以當做是 @文刀秋二大大回答的補充資料=w=
=========================
在知乎上還見過另一位大牛推薦的資料,Life of a triangle 不過這個我讀下來的感覺更偏硬一些,理解起來不如上面那個系列順暢,畢竟自己還是入門級別……圖形渲染管線是提供給軟體開發者和硬體設計者之間的一個抽象。事實上,沒有哪個部分必須用硬體電路實現。這個管線只是說明了graphic pipeline各個階段的功能,然而並沒有規定哪些東西必須由硬體電路實現。具體到硬體電路究竟實現了哪些部分,這個就應該參考各個具體型號的GPU了。不過總的來說,一般情況下,對於比較複雜的部分,會使用驅動模擬。對於功能相對簡單,同時是瓶頸,並行量大的部分,則會採用硬體電路實現。
裁剪、圖元混合等,也是要看GPU而定的。有些架構比較激進的,全部採用Unified結構,沒有為這些Fix Function部分提供硬體電路,那麼就只能在shader裡邊模擬了。而有一些相對傳統的,仍然會有FF的硬體。不過總的趨勢肯定是大一統的,將來只有Unified Shader組成的陣列,到那個時候,GPU就是新的計算核心,graphic只是它的一個功能而已。
紋理單元的作用就是實現紋理解壓,例如BC1-BC7,ASTC等。這些紋理格式的特點是壓縮很難做的很好,但是解壓起來可是又快又容易。紋理單元的主要功能就是負責解壓的。至於你說的紋理線性插值,其實就是紋理解壓的一部分,你可以看看BC1-BC7和ASTC的規範就清楚了。
PowerVR架構不清楚怎麼實現的。N 卡的架構比較籠統的介紹可以看這篇 Life of a triangle
real time rendering 里也有簡單的介紹對 unit level 的細節感興趣,想天天看內部實現的話可以來面試 NV 嘛職位 介紹 -&> 軟硬通吃,魔都帝都 IT 行業年底跳槽指南 - 黑客與畫家 - 知乎專欄我是不是太不要臉了……推薦閱讀:
※全面認識Depth - 這裡有關於Depth的一切
※請教各位在pc上使用webgl以及opengl渲染yuv數據的性能問題,有何改進方向?
※震驚!時間之神又給了這個古老的API+了0.1