OpenGL渲染基礎(chǔ)架構(gòu)

導(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);
    

    ????\color{red}{注意:OpenGL窗口坐標(biāo)是以左下角為(0忿檩, 0), 右上角為(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ì)算出來送入后繼階段捌显。


image.png

????片元著色器的輸入包括:
??????易變變量(varying)—從頂點(diǎn)著色器傳遞到片元著色器的易變變量數(shù)據(jù)茁彭。
片元著色器的輸出包括:
??????gl_FragColor ——計(jì)算后的片元顏色,一般在片元著色器的最后都會對gl_FragColor 進(jìn)行賦值苇瓣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市偿乖,隨后出現(xiàn)的幾起案子击罪,更是在濱河造成了極大的恐慌哲嘲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳禁,死亡現(xiàn)場離奇詭異眠副,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竣稽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門囱怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毫别,你說我怎么就攤上這事娃弓。” “怎么了岛宦?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵台丛,是天一觀的道長。 經(jīng)常有香客問我砾肺,道長挽霉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任变汪,我火速辦了婚禮侠坎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裙盾。我一直安慰自己实胸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布闷煤。 她就那樣靜靜地躺著童芹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤拿。 梳的紋絲不亂的頭發(fā)上假褪,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音近顷,去河邊找鬼生音。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窒升,可吹牛的內(nèi)容都是我干的缀遍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饱须,長吁一口氣:“原來是場噩夢啊……” “哼域醇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤譬挚,失蹤者是張志新(化名)和其女友劉穎锅铅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體减宣,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盐须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漆腌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贼邓。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闷尿,靈堂內(nèi)的尸體忽然破棺而出塑径,到底是詐尸還是另有隱情,我是刑警寧澤悠砚,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布晓勇,位于F島的核電站,受9級特大地震影響灌旧,放射性物質(zhì)發(fā)生泄漏绑咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一枢泰、第九天 我趴在偏房一處隱蔽的房頂上張望描融。 院中可真熱鬧,春花似錦衡蚂、人聲如沸窿克。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽年叮。三九已至,卻和暖如春玻募,著一層夾襖步出監(jiān)牢的瞬間只损,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工七咧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跃惫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓艾栋,卻偏偏與公主長得像爆存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蝗砾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容