圖形學(xué)之Unity渲染管線流程分析
下圖是《Unity Shader 入門精要》一書中的渲染流程圖;
ApplicationStage階段:準(zhǔn)備場景信息(視景體,攝像機(jī)參數(shù))、粗粒度剔除、定義每個模型的渲染命令(材質(zhì),shader)——由開發(fā)者定義,不做討論;
GemetryStage階段:頂點(diǎn)著色器、曲面細(xì)分著色器、幾何著色器、裁剪、屏幕映射;
RasterizerStage階段:三角形設(shè)置遍歷,片元著色器、逐片元操作;
每個階段具體操作如下圖(虛線框是可選階段):
模型空間——矩陣變換——齊次裁剪空間——透視除法——NDC標(biāo)準(zhǔn)設(shè)備坐標(biāo)——屏幕映射
齊次裁剪空間是視景體空間(臺體);
CVV:標(biāo)準(zhǔn)視體-也就是NDC坐標(biāo)系對應(yīng)的空間;
透視除法:頂點(diǎn)坐標(biāo)除以w分量,將當(dāng)前z深度所在的截面縮放為(2,2,2)的截面坐標(biāo);所以w分量記錄了z深度信息;
硬件做透視除法獲得NDC歸一化設(shè)備坐標(biāo)——再經(jīng)過屏幕映射獲得屏幕坐標(biāo)系下頂點(diǎn)坐標(biāo);
Unity使用OpenGL的NDC,z分量在[-1,1];
OpenGL和DirectX差異
NDC空間——OpenGL為[-1,1],DirectX為[0,1],深度z范圍不同;
窗口坐標(biāo)系——DirectX左上角原點(diǎn),OpenGL左下角原點(diǎn);
投影平面——DirectX投影平面就是視景體近截面,OpenGL有視平面;
左右手坐標(biāo)系——DirectX左手,OpenGL右手,叉乘順序;
問題:
為什么片元不叫像素?
片元是很多狀態(tài)的集合,記錄了該像素的屏幕坐標(biāo),深度信息,法線,UV等;
DrawCall為什么會影響性能?
DrawCall是CPU向GPU添加渲染命令的過程,過程會由CPU向GPU發(fā)送數(shù)據(jù)(模型信息),DrawCall的次數(shù)越多CPU消耗性能就越大,DrawCall次數(shù)過多會導(dǎo)致每一幀CPU來不及發(fā)送全部數(shù)據(jù)給GPU渲染;
GPU有一個命令緩存區(qū)(Command Buffer),CPU的渲染命令都會存儲在這里,GPU從命令緩存區(qū)依次執(zhí)行渲染命令;
兩種渲染命令:渲染模型(CPU提交模型信息也就是DrawCall)和改變渲染狀態(tài)(著色器紋理狀態(tài)改變,更耗時);
一般情況都是GPU渲染完成等待CPU發(fā)渲染命令;
相關(guān)文章
C#中foreach循環(huán)對比for循環(huán)的優(yōu)勢和劣勢
循環(huán)語句是編程的基本語句,在C#中除了沿用C語言的循環(huán)語句外,還提供了foreach語句來實(shí)現(xiàn)循環(huán),下面這篇文章主要給大家介紹了關(guān)于C#中foreach循環(huán)對比for循環(huán)的優(yōu)勢和劣勢,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法
這篇文章主要介紹了C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-04-04C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法,涉及C#針對文件的讀寫與zip壓縮相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C#(.Net)將非托管dll嵌入exe中的實(shí)現(xiàn)
本文主要介紹了C#(.Net)將非托管dll嵌入exe中的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12使用C#給PDF文檔添加注釋的實(shí)現(xiàn)代碼
本文將實(shí)例講述C#中如何使用免費(fèi)組件給PDF文檔添加文本注釋,包括自由文本注釋。自由文本注釋能允許我們自定義它的風(fēng)格和外觀,非常具有實(shí)用價值2017-01-01C#實(shí)現(xiàn)的簡單整數(shù)四則運(yùn)算計(jì)算器功能示例
這篇文章主要介紹了C#實(shí)現(xiàn)的簡單整數(shù)四則運(yùn)算計(jì)算器功能,涉及C#界面布局、事件響應(yīng)及數(shù)值運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09