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


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

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


已經有應用角度的答案,我從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)。

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


推薦閱讀:

計算機圖形學,下一步如何提高?
Hyperion渲染器的優勢是什麼?超能陸戰隊 ?
X Window渲染是在client還是server端完成的?
如何將真人照片ps成3d遊戲風格?

TAG:OpenGL | 渲染 | 計算機圖形學 | Direct3D |