OpenGL 鏈?zhǔn)綖V鏡(幀緩沖離屏渲染)

OpenGL 編寫特效在部分應(yīng)用中可通過單個(gè)shader實(shí)現(xiàn)各拷,即通過修過修改頂點(diǎn)著色器或片元著色器實(shí)現(xiàn)疚鲤。但更多的場景是要求有多個(gè)特效組合而成,例如最終效果是圖片灰度加上下顛倒样刷,效果不復(fù)雜條件下可以通過修改片元著色器實(shí)現(xiàn)览爵,當(dāng)效果復(fù)雜特效、組合特效蜓竹、特效的模塊化開發(fā)都會(huì)通過鏈?zhǔn)綖V鏡實(shí)現(xiàn)箕母。

一俱济、鏈?zhǔn)綖V鏡概念

鏈?zhǔn)綖V鏡 通過幀緩沖離屏渲染技術(shù)實(shí)現(xiàn)特效的組合和疊加。通過多次draw最終實(shí)現(xiàn)預(yù)期效果蛛碌。

二、渲染流程中的幀緩沖

OpenGL的工作流程蔚携,輸入像素?cái)?shù)據(jù)和頂點(diǎn)數(shù)據(jù),兩種數(shù)據(jù)分別操作后酝蜒,通過光柵化誊辉,得到片段,再經(jīng)過片段處理秕硝,最后繪制到幀緩沖區(qū)芥映,最終轉(zhuǎn)化為像素?cái)?shù)據(jù)。OpenGL 管線渲染的最終目的地就是FrameBuffer(幀緩沖)远豺。下面是OpenGL渲染流程圖奈偏。


1.jpg

三、幀緩沖對象

在OpenGL渲染管線中躯护,幾何數(shù)據(jù)和紋理經(jīng)過多次轉(zhuǎn)化和多次測試惊来,最后以二維像素的形式顯示在屏幕上。OpenGL管線的最終渲染目的地被稱作幀緩存(framebuffer)棺滞。幀緩沖是一些二維數(shù)組和OpenG所使用的存儲(chǔ)區(qū)的集合:顏色緩存裁蚁、深度緩存、模板緩存和累計(jì)緩存继准。一般情況下枉证,幀緩存完全由window系統(tǒng)生成和管理,由OpenGL使用移必。這個(gè)默認(rèn)的幀緩存被稱作“window系統(tǒng)生成”(window-system-provided)的幀緩存室谚。OpenGL允許我們定義我們自己的幀緩沖,也就是說我們能夠定義我們自己的顏色緩沖,甚至是深度緩沖和模板緩沖秒赤。在一個(gè)幀緩存對象中有多個(gè)顏色關(guān)聯(lián)點(diǎn)猪瞬、一個(gè)深度關(guān)聯(lián)點(diǎn),和一個(gè)模板關(guān)聯(lián)入篮。每個(gè)幀緩存中至少有一個(gè)顏色關(guān)聯(lián)點(diǎn)陈瘦,其數(shù)目與實(shí)體顯卡相關(guān)〕笔郏可以通過GL_MAX_COLOR_ATTACHMENTS_EXT來查詢顏色關(guān)聯(lián)點(diǎn)的最大數(shù)目痊项。
需要注意:FBO中并沒有存儲(chǔ)圖像,只有多個(gè)關(guān)聯(lián)點(diǎn)酥诽。

四线婚、自定義幀緩沖

1:創(chuàng)建一個(gè)幀緩沖.

unsigned int fbo;
glGenFramebuffers(1, &fbo);

2:綁定幀緩沖,幀緩沖會(huì)在被綁定時(shí)隱士開啟
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

3:渲染到紋理

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

五、渲染鏈條

多個(gè)特效組合結(jié)構(gòu)如下,綁定frame buffer 0 作用是再次激活默認(rèn)幀緩沖盆均,在主窗口中有視覺效果。


2.png

1:灰度 fragment shaderGray

precision highp float; uniform sampler2D Texture; 
varying vec2 TextureCoordsVarying; 
const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);
void main (void) { 
 vec4 mask = texture2D(Texture, TextureCoordsVarying); 
 floatluminance = dot(mask.rgb, W); 
 gl_FragColor = vec4(vec3(luminance), 1.0); 
}

1:上下顛倒 fragment shaderReverse

precision highp float;
uniform sampler2D Texture;
varying vec2 TextureCoordsVarying;

void main (void) {
    vec4 color = texture2D(Texture, vec2(TextureCoordsVarying.x, 1.0 - TextureCoordsVarying.y));
    gl_FragColor = color;
}

偽代碼如下:

// Step one

unsigned int fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

DrawShaderGray(); //繪制結(jié)果在texture

//setp two  
DrawWithGrayInShaderReverse(texture)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漱逸,一起剝皮案震驚了整個(gè)濱河市泪姨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饰抒,老刑警劉巖肮砾,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袋坑,居然都是意外死亡仗处,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門枣宫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洋幻,你說我怎么就攤上這事翅娶。” “怎么了燥翅?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵森书,是天一觀的道長拄氯。 經(jīng)常有香客問我,道長译柏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任典唇,我火速辦了婚禮介衔,結(jié)果婚禮上骂因,老公的妹妹穿的比我還像新娘。我一直安慰自己寒波,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布绸栅。 她就那樣靜靜地躺著页屠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪风纠。 梳的紋絲不亂的頭發(fā)上议忽,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天栈幸,我揣著相機(jī)與錄音,去河邊找鬼速址。 笑死由驹,一個(gè)胖子當(dāng)著我的面吹牛昔园,可吹牛的內(nèi)容都是我干的默刚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼荤西,長吁一口氣:“原來是場噩夢啊……” “哼邪锌!你這毒婦竟也來了癌瘾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤妇萄,失蹤者是張志新(化名)和其女友劉穎嚣伐,沒想到半個(gè)月后萍丐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝变,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奋构,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年弥臼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺栅。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氧卧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沙绝,到底是詐尸還是另有隱情,我是刑警寧澤星著,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布粗悯,位于F島的核電站,受9級特大地震影響邮丰,放射性物質(zhì)發(fā)生泄漏剪廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一斗蒋、第九天 我趴在偏房一處隱蔽的房頂上張望笛质。 院中可真熱鬧,春花似錦跷究、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩然。三九已至,卻和暖如春夫偶,著一層夾襖步出監(jiān)牢的瞬間兵拢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工杨赤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疾牲。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓阳柔,卻偏偏與公主長得像舌剂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子霍转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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