導(dǎo)語:
渲染管線(渲染流水線)淌哟,一般由顯示芯片(GPU)內(nèi)部處理圖形信號的并行處理單元組成岸蜗。這些并行處理單元兩兩之間互相獨(dú)立埃难。不同的型號硬件上獨(dú)立處理單元的數(shù)量有很大差別擅腰。與CPU串行執(zhí)行不同蟋恬,渲染管線中的各個(gè)處理單元并行處理,渲染效率可以得到極大地提升趁冈。
-
1歼争、渲染管線
1.1、渲染管線流程圖:
image.png
??1.1.1渗勘、基本處理:
????該階段設(shè)定3D空間中物體的頂點(diǎn)坐標(biāo)沐绒、頂點(diǎn)對應(yīng)顏色、頂點(diǎn)的紋理坐標(biāo)等屬性旺坠。并且指定繪制方式:點(diǎn)繪制乔遮、線繪制、三角形繪制取刃。
??1.1.2申眼、頂點(diǎn)緩沖區(qū)
????這部分功能在程序中是可選的瞒津,但是一般情況下,都要使用括尸,不為別的巷蚪,主要為了提高GPU的IO帶寬和性能優(yōu)化,使用的情況為輸入的頂點(diǎn)數(shù)據(jù)基本沒有變化的情況下濒翻,在初始化階段將這些頂點(diǎn)輸入到頂點(diǎn)緩沖區(qū)屁柏,在繪制每一幀時(shí)就可以直接從緩沖區(qū)里面拿取并使用,再也不用從cpu的存儲器中進(jìn)行拿取有送。??1.1.3淌喻、變換和光照
????a、頂點(diǎn)變換任務(wù):對3D物體的各個(gè)頂點(diǎn)的平移雀摘、縮放和旋轉(zhuǎn)的功能裸删。
????b、光照計(jì)算任務(wù):根據(jù)光照的位置阵赠、性質(zhì)涯塔、各通道強(qiáng)度,物質(zhì)材質(zhì)清蚀,來計(jì)算物體的各個(gè)頂點(diǎn)的光照情況匕荸。??1.1.4、圖元裝配
????a枷邪、圖元組裝:頂點(diǎn)數(shù)據(jù)根據(jù)設(shè)置的繪制方式被結(jié)合在一起榛搔。
????b、圖元處理:通過幾個(gè)幾何著色器進(jìn)行對物體圖形的處理东揣,后續(xù)再進(jìn)行詳細(xì)介紹践惑。??1.1.5、光柵化
????主要用于決定哪些像素點(diǎn)最后可以渲染的屏幕上嘶卧。??1.1.6童本、紋理環(huán)境和顏色求和
????從紋理圖中某個(gè)紋理坐標(biāo)位置獲取該位置顏色值
????根據(jù)紋理采樣值和光照計(jì)算等結(jié)果生成片元的最終顏色。??1.1.7脸候、Alpha測試
????Alpha除了在顏色混合的時(shí)候需要用到意外,還有一個(gè)用途就是Alpha測試绑蔫,Alpha測試的原理:當(dāng)每個(gè)像素即將繪制時(shí)运沦,如果啟動了Alpha測試,OpenGL會檢查像素的Alpha值配深,只有Alpha值滿足條件的像素才會繪制(嚴(yán)格的說携添,滿足條件的像素會通過本項(xiàng)測試,進(jìn)行下一種測試篓叶,只有所以測試都通過烈掠,才能進(jìn)行繪制)羞秤,不滿足條件的澤不進(jìn)行繪制。這個(gè)"條件"可以設(shè)置成:始終通過左敌,始終不通過瘾蛋,大于設(shè)定值則通過,小于設(shè)定值則通過矫限,等于設(shè)定值則通過哺哼、大于等于、小于等于叼风、不等于則通過取董。????可以通過下面的代碼來啟用或禁用Alpha測試
glEnable(GL_ALPHA_TEST); // 啟用Alpha測試 glDisable(GL_ALPHA_TEST); // 禁用Alpha測試
????可以通過下面的代碼來設(shè)置Alpha測試條件為“大于0.5則通過”
glAlphaFunc(GL_GREATER, 0.5f);
????該函數(shù)的第二個(gè)參數(shù)表示設(shè)定值,用于進(jìn)行比較无宿。第一個(gè)參數(shù)是比較方式茵汰,除了GL_LESS(小于則通過)外,還可以選擇:
????GL_ALWAYS(始終通過)孽鸡,
????GL_NEVER(始終不通過)蹂午,
????GL_LESS(小于則通過),
????GL_LEQUAL(小于等于則通過)梭灿,
????GL_EQUAL(等于則通過)画侣,
????GL_GEQUAL(大于等于則通過),
????GL_NOTEQUAL(不等于則通過)堡妒。??1.1.8配乱、裁剪測試
????裁剪測試用于限制繪制區(qū)域,當(dāng)開啟裁剪測試皮迟,只有沒有被裁剪的窗口內(nèi)的像素點(diǎn)會繪制搬泥,其他像素不在窗口內(nèi)的則都不會繪制
????可以通過下面的代碼來啟用或禁用剪裁測試:glEnable(GL_SCISSOR_TEST); // 啟用剪裁測試 glDisable(GL_SCISSOR_TEST); // 禁用剪裁測試
????可以通過下面的代碼來指定一個(gè)位置在(x, y),寬度為width伏尼,高度為height的剪裁窗口
glScissor(x, y, width, height);
????
??1.1.9、深度測試
????深度測試爆阶,就是對深度緩沖區(qū)內(nèi)的像素深度值與新值進(jìn)行比較燥透,來判斷是否通過測試,這樣在渲染圖形的時(shí)候辨图,無線考慮圖形中圖形渲染順序問題班套。????通過glEnable/glDisable函數(shù)可以啟用或禁用深度測試
glEnable(GL_DEPTH_TEST); // 啟用深度測試 glDisable(GL_DEPTH_TEST); // 禁用深度測試
????至于通過測試的條件,同樣有八種故河。條件設(shè)置是通過glDepthFunc函數(shù)完成的吱韭,默認(rèn)值是GL_LESS。
glDepthFunc(GL_LESS);
????除了GL_LESS(小于則通過)外鱼的,還可以選擇:
????GL_NEVER,不通過(輸入的深度值不取代參考值)
????GL_LESS,如果輸入的深度值小于參考值理盆,則通過
????GL_EQUAL,如果輸入的深度值等于參考值痘煤,則通過
????GL_LEQUAL,如果輸入的深度值小于或等于參考值,則通過
????GL_GREATER,如果輸入的深度值大于參考值猿规,則通過
????GL_NOTE_QUAL,如果輸入的深度值不等于參考值衷快,則通過
????GL_GEQUAL,如果輸入的深度值大于或等于參考值,則通過
????GL_ALWAYS,總是通過(輸入的深度值取代參考值)
- 2坎拐、渲染管線
2.1烦磁、著色器:
????概念:著色器(Shader)是運(yùn)行在GPU上的小程序。這些小程序?yàn)閳D形渲染管線的某個(gè)特定部分而運(yùn)行哼勇。從基本意義上來說都伪,著色器只是一種把輸入轉(zhuǎn)化為輸出的程序。著色器也是一種非常獨(dú)立的程序积担,因?yàn)樗鼈冎g不能相互通信陨晶;它們之間唯一的溝通只有通過輸入和輸出。
????2.1.1 頂點(diǎn)著色器
??????其工作過程為首先將原始的頂點(diǎn)幾何信息及其他屬性傳送到頂點(diǎn)著色器中帝璧,經(jīng)過自己開發(fā)的頂點(diǎn)著色器處理后產(chǎn)生紋理坐標(biāo)先誉,顏色,點(diǎn)位置等后續(xù)流程需要的各項(xiàng)頂點(diǎn)屬性信息的烁,然后將其傳遞給圖元裝配階段褐耳。
image.png
????頂點(diǎn)著色器的輸入包括:
??????著色器程序——描述頂點(diǎn)上執(zhí)行操作的頂點(diǎn)著色器程序源代碼或者可執(zhí)行文件。
??????屬性變量(attribute)——用頂點(diǎn)數(shù)組提供的每個(gè)頂點(diǎn)的數(shù)據(jù)渴庆。
??????統(tǒng)一變量(uniform)——頂點(diǎn)著色器使用的不變數(shù)據(jù)铃芦。
??????采樣器——代表頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型。
??????頂點(diǎn)著色器的輸出包括:
????????內(nèi)建輸出變量——例如gl_Position襟雷,經(jīng)過變換矩陣變換后的頂點(diǎn)最終位置刃滓。
????????易變變量(varying)——從頂點(diǎn)著色器計(jì)算產(chǎn)生并傳遞給片元著色器的數(shù)據(jù)變量。
????2.1.2 片元著色器
??????片元著色器是用于處理片元值及其相關(guān)數(shù)據(jù)的可編程單元耸弄,其可以執(zhí)行紋理的采樣咧虎,顏色的匯總,計(jì)算霧顏色等操作计呈,每片元執(zhí)行一次砰诵。片元著色器主要功能為通過重復(fù)執(zhí)行(每片元一次),將3D物體中的圖元光柵化后產(chǎn)生的每個(gè)片元的顏色等屬性計(jì)算出來送入后繼階段捌显。
????片元著色器的輸入包括:
??????易變變量(varying)—從頂點(diǎn)著色器傳遞到片元著色器的易變變量數(shù)據(jù)茁彭。
片元著色器的輸出包括:
??????gl_FragColor ——計(jì)算后的片元顏色,一般在片元著色器的最后都會對gl_FragColor 進(jìn)行賦值苇瓣。