1. 程式人生 > 其它 >shader 入門精要筆記(3)

shader 入門精要筆記(3)

Draw Call:CPU呼叫影象程式設計介面,如OpenGl中的glDrawElements命令或DX中的DrawIndexedPrimitive命令,以命令GPU進行渲染的操作。

CPU和GPU是如何實現並行工作的?

解決方法:使用一個命令緩衝區來避免CPU等到GPU完成上一個渲染任務才能再次傳送命令造成的效率低下。命令緩衝區包含一個命令佇列,由CPU向其新增命令,而GPU從中讀取命令,新增和讀取的命令是互相獨立的從而實現CPU和GPU獨立工作,這便是命令緩衝區的作用。命令緩衝區中的命令除了Draw Call一種外,還有改變渲染狀態等(改變使用的著色器,使用不同的紋理)

為何Draw Call多了會影響效率?

每次呼叫Draw Call前,CPU需要向GPU傳送很多內容,包括資料,狀態,命令。這一階段中,CPU需要完成許多工作,檢查渲染狀態等,一旦CPU完成了這些準備工作,GPU便可開始本次渲染。GPU渲染能力極強,渲染速度往往快於CPU提交命令的速度,如果Draw Call太多,CPU會把大量時間花在提交Draw Call上,造成CPU的過載。

如何減少Draw Call?

批處理是較為好的解決辦法。如果提交大量很小的Draw Call會造成CPU效能的瓶頸,如果將其合併成一個大的Draw Call便很好的解決這個問題。由於我們需要在CPU的記憶體中合併網格,合併的過程也是需要消耗時間的。因此,批處理技術指在適合合併那些靜態的物體,例如(大地,石頭,靜態的物品等)對於靜態物體只需合併一次即可。對動態物體進行批處理時由於這些物體不斷運動,每一幀都需重新合併然後發給GPU,因此對空間和時間都會有影響。

在遊戲開發過程中,減少Draw Call需注意兩點:1.避免使用大量很小的網格。當不可避免的需要使用很小的網格結構時,考慮是否可以合併他們。2.避免使用過多的材質。儘量在不同的網格之間共同使用一個材質。

具體來說shader就是:1.GPU流水線上的一些可高度程式設計的階段,而由著色器編譯出來的最終程式碼是會在GPU執行的。2.特定型別的著色器(頂點著色器,片元著色器)3.依靠著色器我們可以控制流速線中渲染的細節(利用頂點著色器進行頂點的變換或者傳遞資料,用片元著色器進行逐畫素的渲染)一個好的遊戲畫面需適當的渲染狀態,合適的混合函式,是否關閉(深度測試/深度寫入)等,當然美術資源的質量越高,資源越規範對這一階段的幫助也是極大的。