“渲染管線是干什么用的裳食?”
“OpenGL、DirectX和渲染管線的關(guān)系芙沥?”
“渲染管線誰(shuí)來(lái)開(kāi)發(fā)?”
“為什么一些游戲引擎廠商也在做渲染管線诲祸?”
這是筆者在研究時(shí)曾碰到過(guò)的一些問(wèn)題《颍看了大神們的解答救氯,理解如下。理解可能略有淺薄歌憨,之后會(huì)不斷學(xué)習(xí)持續(xù)更新:
1. 渲染管線(render pipeline)是什么
告訴GPU怎么進(jìn)行圖形渲染的架構(gòu)
????GPU是什么着憨?專(zhuān)門(mén)用來(lái)處理圖像的芯片。CPU作為計(jì)算機(jī)的大腦調(diào)度事情+處理事情务嫡,一個(gè)人搞不定了甲抖,出現(xiàn)GPU幫助CPU分擔(dān)一部分事情
分為3個(gè)大步驟,應(yīng)用階段(CPU把要處理的數(shù)據(jù)發(fā)給GPU)心铃、幾何階段(處理模型准谚,加光影、剪裁等)于个、光柵化階段(把3D模型“像素化”,使其能在屏幕是顯示出來(lái))
具體步驟細(xì)節(jié)詳見(jiàn)“猴子也能看懂的渲染管線(Render Pipeline)”
1)應(yīng)用階段:CPU把要處理的數(shù)據(jù)(渲染圖元)發(fā)給GPU
2)幾何階段:輸出頂點(diǎn)信息
? ? 什么是頂點(diǎn)信息(Vertex)暮顺?任何3D模型都是由三角形/四邊形構(gòu)成厅篓。頂點(diǎn)信息=每個(gè)三角形/四邊形的頂點(diǎn)的xyz坐標(biāo)秀存。知道頂點(diǎn)坐標(biāo),連線羽氮,就能畫(huà)出3D模型
? ? 包括~7個(gè)子步驟:
①CPU把一部分圖元信息存起來(lái)或链,用于非渲染場(chǎng)景(例如一面墻,發(fā)給GPU渲染档押,還要留著用于計(jì)算物體碰撞)澳盐。發(fā)Draw Call指令給GPU,讓GPU開(kāi)工令宿。
②頂點(diǎn)著色器叼耙,進(jìn)行模型轉(zhuǎn)化與相機(jī)轉(zhuǎn)換。頂點(diǎn)的坐標(biāo)用于描述在一個(gè)“世界”中它的位置粒没,但是為了“拍攝”這個(gè)模型筛婉,需要告訴計(jì)算機(jī)這個(gè)模型相對(duì)攝像機(jī)的位置。需要坐標(biāo)的轉(zhuǎn)化癞松,把之前的世界坐標(biāo)轉(zhuǎn)化為相對(duì)攝像機(jī)的坐標(biāo)爽撒。還可以進(jìn)行光照處理,給模型加上光影响蓉。
③曲面細(xì)分著色器(Tessellation Stage):給模型多加些頂點(diǎn)硕勿,使模型更圓滑》慵祝或者增加細(xì)節(jié)源武,比如把圓球變成隕石。
④幾何著色器(Geometry Shader):改言秸、刪頂點(diǎn)软能。(和上一步區(qū)別by我的理解,請(qǐng)大佬指正:曲面細(xì)分著色器更細(xì)節(jié)举畸,改細(xì)節(jié)形狀查排,比如表面凹凸;幾何著色器改大的形狀抄沮,比如圓球變成一半)跋核。
⑤投影:把3D圖形2D化,降維~叛买。從而使其能顯示在我們的2D屏幕上砂代。
⑥剪裁:把屏幕“看”不到的部分去掉,不用渲染率挣,節(jié)省資源
⑦屏幕映射:屏幕是由尺寸去別的刻伊,調(diào)整模型坐標(biāo)系
3)光柵化階段:即”像素化“。屏幕由像素構(gòu)成,要讓模型顯示在屏幕中捶箱。
包括? 個(gè)子步驟
①圖元組裝:把點(diǎn)連成線智什,組成三角形。
②三角形遍歷(Triangle Traversal):確定填色的區(qū)域/像素點(diǎn)丁屎。
③片元著色器:確定每塊(片元)填什么顏色荠锭。
④逐片元操作(Per-Fragment Operations):測(cè)試(Test)并合并片元,完成上色晨川。測(cè)試過(guò)程中會(huì)進(jìn)行剪裁证九、深度測(cè)試(設(shè)置渲染物體之間的遮擋關(guān)系)
2. OpenGL、DirectX和渲染管線的關(guān)系共虑?
OpenGL愧怜、DirectX是實(shí)現(xiàn)渲染管道的一套API。整個(gè)渲染管線需要調(diào)用很多應(yīng)用程序看蚜。使用OpenGL叫搁、DirectX后,程序員無(wú)需自己寫(xiě)代碼供炎,直接調(diào)用即可(例如煙霧效果不用自己寫(xiě)渴逻,直接調(diào)就行)
二者的區(qū)別?
OpenGL是Khronos開(kāi)發(fā)的
DirectX是微軟開(kāi)發(fā)的
二者的管線流程音诫、允許開(kāi)發(fā)者配置的部分略有不同惨奕。二者各有優(yōu)劣,暫不展開(kāi)
3. OpenGL竭钝、DirectX和GPU硬件的關(guān)系梨撞?
渲染管線包括兩部分,和硬件GPU強(qiáng)相關(guān)的香罐,開(kāi)發(fā)者不能改的卧波;以及開(kāi)發(fā)者可配置的部分。前一部分需要硬件廠商基于OpenGL/DirectX調(diào)整配置
OpenGL/DirectX會(huì)提供“說(shuō)明書(shū)”(OpenGL規(guī)范)給GPU廠商(NVIDIA等)
4. 誰(shuí)來(lái)開(kāi)發(fā)渲染管線庇茫?渲染管線涉及到哪些公司港粱?
- GPU公司:需要根據(jù)OpenGL/DirectX,調(diào)整硬件
- 微軟旦签、Khronos:運(yùn)營(yíng)維護(hù)OpenGL/DirectX
- 游戲開(kāi)發(fā)者:基于自己需求查坪,用OpenGL/DirectX等開(kāi)發(fā)游戲
遺留問(wèn)題:
- 渲染管線和游戲引擎商的關(guān)系?
- 渲染管線和OS廠商的關(guān)系宁炫?
參考資料:感謝各位大神答疑偿曙!
-?猴子也能看懂的渲染管線(Render Pipeline)