前言
在github看了一份英文教程,題目為《How OpenGL works: software rendering in 500 lines of code》,看了之后收獲很大载慈。當(dāng)時(shí)還跟作者聯(lián)系要翻譯成中文丰包,結(jié)果拖了好久沒(méi)有做饶唤,最近看了同學(xué)寫的技術(shù)博客谅河,感覺(jué)自己也應(yīng)該寫點(diǎn)什么,所以有了這個(gè)系列叶骨。
本系列教程的目的是通過(guò)c++對(duì)渲染管線的實(shí)現(xiàn)茫多,加深對(duì)于圖形渲染整個(gè)流程的理解。作為系列第一篇忽刽,先介紹一下教程的計(jì)劃和基礎(chǔ)知識(shí)天揖,本教程會(huì)先按照那篇英文教程的順序開(kāi)展夺欲,后續(xù)再加上自己的東西(不同的光照模式,shader實(shí)現(xiàn)的中高級(jí)效果等等)今膊。
本教程寫出來(lái)一是為了促進(jìn)自己學(xué)習(xí)些阅,二來(lái)假如能為其他初學(xué)者提供一點(diǎn)點(diǎn)幫助,就再好不過(guò)了斑唬。另外市埋,因?yàn)楸救怂綄?shí)在有限,必定有很多地方理解的較為膚淺恕刘,或者難免有些錯(cuò)誤缤谎,希望大家不吝賜教,共同進(jìn)步褐着!
教程目錄
- 畫一條直線
- 三角形的光柵化與背面剔除
- 通過(guò)z-buffer移除被隱藏的面
- 透視投影
- 移動(dòng)攝像機(jī)
- 軟渲染中的shader
- 陰影
- 光照
- 待續(xù)...
基礎(chǔ)知識(shí)
什么是渲染管線坷澡?
網(wǎng)上的解釋有很多,我也就不復(fù)制粘貼別人的了含蓉,說(shuō)一下自己的理解频敛。
渲染管線是一條工作流水線,模型制作人員制作好的模型數(shù)據(jù)馅扣,通過(guò)CPU的控制傳輸?shù)紾PU顯存中斟赚,GPU通過(guò)對(duì)數(shù)據(jù)的處理(頂點(diǎn)位置的處理,顏色的填充)差油,最終把圖像顯示到屏幕上拗军,這一套工作流程就叫做渲染管線。因?yàn)槠聊簧系膱D像每幀要刷新60次乃至120次厌殉,所以這套工作流程是不斷的重復(fù)的進(jìn)行的食绿,就像工作在流水線上的工人一樣侈咕。流水線上的工人不同工位分工不同公罕,每個(gè)人只負(fù)責(zé)自己的工作。我們的渲染管線也一樣耀销,下面祭出幾張渲染管線的流程圖楼眷,讓我們看看在渲染中每個(gè)“工位”的工作是什么。
假如模型制作人員的最終制作的是牛的模型(模型由大量的三角形組成熊尉,每個(gè)三角形包含三個(gè)頂點(diǎn)的數(shù)據(jù))罐柳,該模型傳入顯存后,GPG首先將每個(gè)頂點(diǎn)取出狰住,執(zhí)行頂點(diǎn)著色器(針對(duì)每個(gè)頂點(diǎn)執(zhí)行的shader代碼)张吉,之后會(huì)將頂點(diǎn)按照三個(gè)一組進(jìn)行裝配,之后分別執(zhí)行幾何著色器和細(xì)分著色器代碼(這兩個(gè)貨到底怎么用筆者完全不知道催植,看了一些教程也沒(méi)有詳細(xì)說(shuō)明肮蛹,筆者是做手機(jī)游戲開(kāi)發(fā)的勺择,工作中完全用不到),下一步會(huì)對(duì)之前的三角形數(shù)據(jù)進(jìn)行光柵化后送入片段著色器伦忠,片段著色器可以理解為針對(duì)每個(gè)像素執(zhí)行的代碼省核,光柵化的操作是補(bǔ)充三角形內(nèi)的像素點(diǎn)(不進(jìn)行光柵化我們就只有三角形三個(gè)頂點(diǎn),光柵化由GPU自動(dòng)完成)昆码。在片段著色器中气忠,我們對(duì)每個(gè)像素的顏色進(jìn)行填充。
片段著色器中輸出的顏色最終還要通過(guò)測(cè)試(以決定是否繪制在屏幕上赋咽,被其他物體擋住的物體的顏色要舍棄)與混合(與屏幕中原有顏色進(jìn)行混合旧噪,例如半透明物體與后面物體的顏色疊加)。
我們接下來(lái)的教程脓匿,就是要實(shí)現(xiàn)這一工作流程舌菜,把模型數(shù)據(jù)“繪制在屏幕上”(其實(shí)是寫入一張圖片,原理一樣)亦镶。