渲染管線裡為什麼geometry stage在tessellation stage的後面而不是前面?

時間 2021-06-03 04:24:25

1樓:xiaocai

已經有應用角度的答案,我從pipeline的角度談一下:

1. 放在前面沒啥好處

Tessellation stage吃進的Primitive Type是Patch(1~32個Control Point),如果把GS置其前,GS所起的作用就是對Patch做一些處理(比如Transform,產生新的Control Point點等),這個活其實就是Hull Shader幹的,而且Hull Shader幹這活的效率比GS高

不可否認,GS是一種Performance不理想的Shader:在Unify Shader架構裡,ALU/Cache是VS/HS/DS/GS共用的,而GS輸出的所有Vertex序列於同乙個Shader裡,受Cache資源的限制,限制了GS處理Geometry的並行度。

GS為什麼不如HS?感興趣的可以揣摩下這個簡單的例子:假設emit出32個頂點,Cache只有64個頂點空間可用,pipeline裡有4組ALU(SIMD4):

1)對於GS,單個Shader thread需要分配32個頂點的Cache空間,GS Emit 32個頂點意味著只能同時執行2個Geometry的Shading,這樣下來,有2條Lane的ALU在空轉;

2)而DX11讓HULL Shader對Control Point/ Patch Const並行處理的(估計是想改善GS的Performance問題)。同樣處理32個頂點,單個Shader thread需要分配1個頂點的Cache空間,跑滿4條lane需4個頂點空間時,Cache綽綽有餘,這樣將不會出現空轉的ALU。

2、不放後面不行

Tessellation吐出的是一堆頂點,對於Primitive級別的處理(如normal計算,easy wireframe),Domain Shader做不到(其實DS像極了Vertex Shader,同樣並行處理Vertex)。

所以,放到前面做得沒人家好,不放到後面也不行。

2樓:叛逆者

GS需要知道整個primitive的資訊,而tessellation之後,這樣的資訊才存在。

舉個例子,乙個三角形,可以在GS裡計算它的normal。只有在tessellation之後,計算出的normal才是正確的normal。如果GS在前,那麼tessellation裡如果改變了三個頂點的座標,比如說根據displacement map來偏移頂點,那麼之前GS計算的normal就沒意義了。

為什麼要做node js服務端渲染?

我是老尚 這其實是乙個工作場景不斷 前移 的過程。最早期的頁面只是html css,後來內容都是直接套在php jsp裡的。但這樣速度很慢,並且在架構上存在緊耦合。後來把頁面的渲染生成放在js裡,前端只要獲得Json資料,就可以動態的更新頁面,這就是ajax。這時前端頁面的更新 響應速度有了極快的提...

為什麼Blender渲染動畫要比PC遊戲渲染更慢?

瑞雲渲染Renderbus雲渲染農場 為什麼Blender渲染動畫要比PC遊戲渲染更慢?原因 Blender遊戲引擎和Blender渲染動畫,內部資料結構不同,運作方式也不同。一 Blender內建了遊戲引擎BGE Blender Game Engine 在遊戲引擎中,模型是靜態的,不能改變。靜態,...

UNITY渲染為什麼不把模型拆分,即使只有乙個頂點在攝像機內也要把整個模型渲染出來?

PZZZB 按我的理解,對圖元進行剔除的操作CPU遠遠沒有GPU快。所以CPU做的是模型層面的剔除,GPU做的是圖元層面的剔除,這樣效率是最高的。 小旭 感覺應該是取捨問題 如果你的問題在於面數不多的模型,感覺沒必要這麼做,執行時拆分反而會加重cpu的開銷 如果你的問題在於面數比較多的模型,確實應該...