渲染管線里為什麼geometry stage在tessellation stage的後面而不是前面?
01-21
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遊戲風格?