GPU畫像素的順序是什麼

2021-07-22 22:38:30 字數 2652 閱讀 6438

熟悉實時圖形的人都知道,gpu裡面有很大一塊是rasterizer,用來把vs輸出的頂點資料光柵化成畫素資料,交給ps。然而,這部分一直是乙個黑盒。gpu是以什麼樣的順序進行光柵化?傳統光柵化和tile-based光柵化有什麼區別?這些問題原先只能進行概念性的定性分析。

到了d3d11 feature level 11.0的時代,硬體支援對乙個buffer的內容進行原子操作。也就是說,可以在ps裡通過呼叫interlockedadd等方法,來讓畫素之間序列化執行。這樣以來,等於給我們開啟了**光柵化順序之門。不需要保密資料、不需要硬體知識,寫個簡單的shader就可以完全從結果上看出光柵化的奧秘。

下面的程式實現到了klayge

裡,乙個稱為rasterizationorder的教程。由於還沒完成opengl和opengles外掛程式裡的rw buffer支援,d3d12的外掛程式還有bug,目前只能用d3d11來執行。平台是windows desktop和uwp。

要完成這件事情的**非常簡單。完全只是利用了shader model 5.0裡面提供的功能。

rwbyteaddressbuffer ras_order_buff;

...

uint getrasterizationorder()

ras_order_buff是乙個大小只有4位元組的buffer,初始值為0。interlockedadd保證了原子+1,原先buffer裡的值就通過old_value返回出來了。在ps裡呼叫這個函式,就能得到自己是第幾個到達此處的pixel。

有了這個順序值之後,就可以把它編碼成顏色輸出。

float4 rasterizationorderps() : sv_target

如果你覺得那樣出來的顏色看不明白,還可以把它編碼成color map輸出。這裡用的是matlab裡稱為parula的color map。從藍到黃表示0到1。

有了這些ps,我們只要畫乙個超過螢幕大小的三角形,就能從顏色上**gpu光柵化的工作方式了。

嚴格來說,我們看到的並不是光柵化的順序,而是光柵化後到達ps的順序。所以這也和排程有關。所以我們這裡主要看的是光柵化的pattern,而不是嚴格的次序關係。

首先登場的是amd firepro v3900專業卡 (不要以為我光黑amd,我也用)。它用的是cayman核心,和桌面級radeon hd 69xx相同。把順序編碼成顏色後,看起來是這樣的。

之後我們就只貼color map的結果。

下乙個測試的是nvidia quadro 600,fermi核心,和桌面級geforce gtx 4xx相同。它的順序是從左到右,以16個pixel的高度為單位,總的來說是連續光柵化,但有些跳變,表明ps的排程更隨機。

intel hd graphics 520的。仍然和前面很相似,以16個pixel的高度為單位從左到右光柵化。

看了兩個傳統光柵化的gpu,再來看看tile-based的。這裡選的是lumia 950的qualcomm adreno 430。可以從結果上很明顯地看出來,tile的大小是8x8,tile之內是zigzag的順序,tile之間並非像傳統光柵化那樣連續前進。

最傳統的d3d11 ref上,光柵化是乙個畫素乙個畫素,從左到右前進的。中規中矩的軟體光柵化實現方法。同時也可以看出,乙個大三角形被拆成了兩個,分別光柵化。對於gpu來說,拆primitive會涉及到頂點數變化,比較費勁,不如就整個光柵化了,螢幕之外的畫素裁掉。反正瓶頸在io而不是光柵化本身。而軟體光柵化正好相反。頂點變化無所謂,光柵化本身的開銷大。所以就用了嚴格的clip,並只光柵化螢幕內的畫素。

warp也一樣,拆成兩個三角形。然而warp融合了一定的tile-based做法,是以2x2的小tile為單位,向前推進。所以看起來比較碎。

nvidia geforce gtx 960上的結果。之前有傳言說maxwell和pascal的gpu偷偷地用了tile-based

。但我們在這裡看到的是這樣的順序。

通過這些分析,我們可以大致的知道每種硬體的光柵化單位。在寫ps的時候,如果分支是這樣的單位大小的整倍數,那麼分支就是無開銷的。不要再認為gpu上的if是把兩個分支都執行一遍,取結果了。只有在一定條件下才是那樣。

因為我能。

OpenGL是什麼 GPU是什麼?

一 gpu與cpu cpu是處理基本算數運算的單元 它處理的資料是數 整型 浮點型 bool等等 gpu是處理圖形運算的單元 它處理的資料是圖形的資料矩陣 gpu的輸入是乙個和多個圖形,輸出是對乙個和多個圖形的處理結果 圖形合成 色值反轉等等 本質上是矩陣運算和內建的解碼演算法。編碼 位圖 圖形操作...

目標客戶畫像 使用者畫像是什麼?怎麼做使用者畫像?

很多人說過 使用者虐我千百遍,我待使用者如初戀 然而,你真的待使用者如初戀了嗎?你知道使用者的年齡 學歷 喜好嗎?一 使用者畫像是什麼 簡而言之,使用者畫像是根據使用者社會屬性 生活習慣和消費行為等資訊抽象出的乙個標籤化的使用者模型。標籤化的使用者 根據不同產品 不同目的,使用者畫像又分 品類使用者...

GPU是什麼以及GPU在機器學習裡起著什麼樣的作用

圖形處理器 英語 graphics processing unit,縮寫 gpu 又稱顯示核心 視覺處理器 顯示晶元,是一種專門在個人電腦 工作站 遊戲機和一些移動裝置 如平板電腦 智慧型手機等 上做影象和圖形相關運算工作的微處理器。gpu使顯示卡減少了對cpu的依賴,並進行部分原本cpu的工作,尤...