日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

转 OpenGL核心技术之帧缓冲

發(fā)布時(shí)間:2023/12/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转 OpenGL核心技术之帧缓冲 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先給大家分享一個(gè)巨牛的人工智能教程,是我無意中發(fā)現(xiàn)的。教程不僅是零基礎(chǔ),通俗易懂,而且非常風(fēng)趣幽默,還時(shí)不時(shí)有內(nèi)涵段子,像看小說一樣,哈哈~我正在學(xué)習(xí)中,覺得太牛了,所以分享給大家!點(diǎn)這里可以跳轉(zhuǎn)到教程

筆者介紹:姜雪偉,IT公司技術(shù)合伙人,IT高級(jí)講師,CSDN社區(qū)專家,特邀編輯,暢銷書作者,國(guó)家專利發(fā)明人;已出版書籍:《手把手教你架構(gòu)3D游戲引擎》電子工業(yè)出版社和《Unity3D實(shí)戰(zhàn)核心技術(shù)詳解》電子工業(yè)出版社等。

CSDN視頻網(wǎng)址:http://edu.csdn.net/lecturer/144

本篇博文主要是給讀者解密關(guān)于游戲后處理渲染效果的原理,后處理渲染效果在Unity,UE4虛幻引擎等商業(yè)引擎 使用的非常多,

比如Bloom,Blur,SSAO,PSSM,HDR等等都屬于后處理渲染效果,它們的實(shí)現(xiàn)其實(shí)就是應(yīng)用幀緩沖技術(shù)實(shí)現(xiàn)的,本篇博文主要是

圍繞幀緩沖給讀者介紹其實(shí)現(xiàn)原理以及應(yīng)用案例。

在前面給讀者介紹了幾種不同的屏幕緩沖:用于寫入顏色值的顏色緩沖,用于寫入深度信息的深度緩沖,以及允許我們基于一些條件丟棄指定片段的模板緩沖。本篇博客主要是給讀者介紹幀緩沖,什么是幀緩沖?其實(shí)就是把前面介紹的這幾種緩沖結(jié)合起來叫做幀緩沖(Framebuffer),它被儲(chǔ)存于內(nèi)存中。OpenGL給了我們自己定義幀緩沖的自由,我們可以選擇性的定義自己的顏色緩沖、深度和模板緩沖。本篇博客主要是給讀者介紹幀緩沖,我們前面介紹的渲染操作都是在默認(rèn)的幀緩沖之上進(jìn)行的,當(dāng)你創(chuàng)建了你的窗口的時(shí)候默認(rèn)幀緩沖就被創(chuàng)建和配置好了,通過創(chuàng)建我們自己的幀緩沖我們能夠獲得一種額外的渲染方式。通過幀緩沖可以將你的場(chǎng)景渲染到一個(gè)不同的幀緩沖中,可以使我們能夠在場(chǎng)景中創(chuàng)建鏡子這樣的效果,或者做出一些炫酷的特效。首先我們會(huì)討論它們是如何工作的,然后我們將利用幀緩沖來實(shí)現(xiàn)一些炫酷的效果。

我們?cè)谝驿秩局薪?jīng)常會(huì)使用一些后處理效果,這些后處理效果就是在幀緩沖中進(jìn)行的。下面我們就告訴讀者幀緩沖是如何工作的?

我們可以使用一個(gè)叫做glGenFramebuffers的函數(shù)來創(chuàng)建一個(gè)幀緩沖對(duì)象(簡(jiǎn)稱FBO):

?

GLuint fbo;glGenFramebuffers(1, &fbo);

?

首先我們要?jiǎng)?chuàng)建一個(gè)幀緩沖對(duì)象,把它綁定到當(dāng)前幀緩沖,做一些操作,然后解綁幀緩沖。我們使用glBindFramebuffer來綁定幀緩沖:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

?

綁定到GL_FRAMEBUFFER目標(biāo)后,接下來所有的讀、寫幀緩沖的操作都會(huì)影響到當(dāng)前綁定的幀緩沖。也可以把幀緩沖分開綁定到讀或?qū)懩繕?biāo)上,分別使用GL_READ_FRAMEBUFFER或GL_DRAW_FRAMEBUFFER來做這件事。如果綁定到了GL_READ_FRAMEBUFFER,就能執(zhí)行所有讀取操作,

像glReadPixels這樣的函數(shù)使用了,綁定到GL_DRAW_FRAMEBUFFER上,就允許進(jìn)行渲染、清空和其他的寫入操作。在此給讀者總結(jié)一下構(gòu)建一個(gè)完整的幀

緩沖滿足的條件:

建構(gòu)一個(gè)完整的幀緩沖必須滿足以下條件:

  • 我們必須往里面加入至少一個(gè)附件(顏色、深度、模板緩沖)。
  • 其中至少有一個(gè)是顏色附件。
  • 所有的附件都應(yīng)該是已經(jīng)完全做好的(已經(jīng)存儲(chǔ)在內(nèi)存之中)。
  • 每個(gè)緩沖都應(yīng)該有同樣數(shù)目的樣本。

上面的條件提到了樣本,如果你不知道什么是樣本也不用擔(dān)心,我們會(huì)在后面的博文中講到。

我們需要為幀緩沖創(chuàng)建一些附件(Attachment),還需要把這些附件附加到幀緩沖上。當(dāng)我們做完所有上面提到的條件的時(shí)候我們就可以用?glCheckFramebufferStatus?帶上?GL_FRAMEBUFFER?這個(gè)參數(shù)來檢查是否真的成功做到了。然后檢查當(dāng)前綁定的幀緩沖,返回了這些規(guī)范中的哪個(gè)值。如果返回的是?GL_FRAMEBUFFER_COMPLETE就對(duì)了:

?

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)? // Execute victory dance

后續(xù)所有渲染操作將渲染到當(dāng)前綁定的幀緩沖的附加緩沖中,由于我們的幀緩沖不是默認(rèn)的幀緩沖,渲染命令對(duì)窗口的視頻輸出不會(huì)產(chǎn)生任何影響。出于這個(gè)原因,它被稱為離屏渲染(off-screen rendering),就是渲染到一個(gè)另外的緩沖中。為了讓所有的渲染操作對(duì)主窗口產(chǎn)生影響我們必須通過綁定為0來使默認(rèn)幀緩沖被激活:

?

?

glBindFramebuffer(GL_FRAMEBUFFER, 0);

當(dāng)我們做完所有幀緩沖操作,不要忘記刪除幀緩沖對(duì)象:

?

?

?

?

glDeleteFramebuffers(1, &fbo);


現(xiàn)在在執(zhí)行完成檢測(cè)前,我們需要把一個(gè)或更多的附件附加到幀緩沖上。一個(gè)附件就是一個(gè)內(nèi)存地址,這個(gè)內(nèi)存地址里面包含一個(gè)為幀緩沖準(zhǔn)備的緩沖,它可以是個(gè)圖像。當(dāng)創(chuàng)建一個(gè)附件的時(shí)候我們有兩種方式可以采用:紋理或渲染緩沖(renderbuffer)對(duì)象。

?

接下來介紹紋理,當(dāng)把一個(gè)紋理附加到幀緩沖上的時(shí)候,所有渲染命令會(huì)寫入到紋理上,就像它是一個(gè)普通的顏色/深度或者模板緩沖一樣。使用紋理的好處是,所有渲染操作的結(jié)果都會(huì)被儲(chǔ)存為一個(gè)紋理圖像,這樣我們就可以簡(jiǎn)單的在著色器中使用了。

創(chuàng)建一個(gè)幀緩沖的紋理和創(chuàng)建普通紋理差不多:

GLuint 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);

這里主要的區(qū)別是我們把紋理的維度設(shè)置為屏幕大小(盡管不是必須的),我們還傳遞NULL作為紋理的data參數(shù)。對(duì)于這個(gè)紋理,

?

我們只分配內(nèi)存,而不去填充它。紋理填充會(huì)在渲染到幀緩沖的時(shí)候去做。

?

如果你打算把整個(gè)屏幕渲染到一個(gè)或大或小的紋理上,你需要用新的紋理的尺寸作為參數(shù)再次調(diào)用glViewport(要在渲染到你的幀緩沖之前

做好),否則只有一小部分紋理或屏幕能夠繪制到紋理上。現(xiàn)在我們已經(jīng)創(chuàng)建了一個(gè)紋理,最后一件要做的事情是把它附加到幀緩沖上:

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

glFramebufferTexture2D函數(shù)需要傳入下列參數(shù):

  • target:我們所創(chuàng)建的幀緩沖類型的目標(biāo)(繪制、讀取或兩者都有)。
  • attachment:我們所附加的附件的類型。現(xiàn)在我們附加的是一個(gè)顏色附件。需要注意,最后的那個(gè)0是暗示我們可以附加1個(gè)以上顏色的附件。我們會(huì)在后面的教程中談到。
  • textarget:你希望附加的紋理類型。
  • texture:附加的實(shí)際紋理。
  • level:Mipmap level。我們?cè)O(shè)置為0。

除顏色附件以外,我們還可以附加一個(gè)深度和一個(gè)模板紋理到幀緩沖對(duì)象上。為了附加一個(gè)深度緩沖,我們可以知道那個(gè)GL_DEPTH_ATTACHMENT作為附件類型。記住,這時(shí)紋理格式和內(nèi)部格式類型(internalformat)就成了?GL_DEPTH_COMPONENT去反應(yīng)深度緩沖的存儲(chǔ)格式。附加一個(gè)模板緩沖,你要使用?GL_STENCIL_ATTACHMENT作為第二個(gè)參數(shù),把紋理格式指定為GL_STENCIL_INDEX。

也可以同時(shí)附加一個(gè)深度緩沖和一個(gè)模板緩沖為一個(gè)單獨(dú)的紋理,這樣紋理的每32位數(shù)值就包含了24位的深度信息和8位的模板信息。為了把一個(gè)深度和模板緩沖附加到一個(gè)單獨(dú)紋理上,我們使用GL_DEPTH_STENCIL_ATTACHMENT類型配置紋理格式以包含深度值和模板值的結(jié)合物。下面是一個(gè)附加了深度和模板緩沖為單一紋理的例子:

glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL );glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texture, 0);

再介紹渲染緩沖對(duì)象,OpenGL引進(jìn)了渲染緩沖對(duì)象(Renderbuffer objects),所以在過去那些美好時(shí)光里紋理是附件的唯一可用的類型。和紋理圖像一樣,渲染緩沖對(duì)象也是一個(gè)緩沖,它可以是一堆字節(jié)、整數(shù)、像素或者其他東西。渲染緩沖對(duì)象的一大優(yōu)點(diǎn)是,它以O(shè)penGL原生渲染格式儲(chǔ)存它的數(shù)據(jù),因此在離屏渲染到幀緩沖的時(shí)候,這些數(shù)據(jù)就相當(dāng)于被優(yōu)化過的了。

渲染緩沖對(duì)象將所有渲染數(shù)據(jù)直接儲(chǔ)存到它們的緩沖里,而不會(huì)進(jìn)行針對(duì)特定紋理格式的任何轉(zhuǎn)換,這樣它們就成了一種快速可寫的存儲(chǔ)介質(zhì)了。然而,渲染緩沖對(duì)象通常是只寫的,不能修改它們(就像獲取紋理,不能寫入紋理一樣)??梢杂胓lReadPixels函數(shù)去讀取,函數(shù)返回一個(gè)當(dāng)前綁定的幀緩沖的特定像素區(qū)域,而不是直接返回附件本身。

因?yàn)樗鼈兊臄?shù)據(jù)已經(jīng)是原生格式了,在寫入或把它們的數(shù)據(jù)簡(jiǎn)單地到其他緩沖的時(shí)候非???。當(dāng)使用渲染緩沖對(duì)象時(shí),像切換緩沖這種操作變得異常高速。我們?cè)诿總€(gè)渲染迭代末尾使用的那個(gè)glfwSwapBuffers函數(shù),同樣以渲染緩沖對(duì)象實(shí)現(xiàn):我們簡(jiǎn)單地寫入到一個(gè)渲染緩沖圖像,最后交換到另一個(gè)里。渲染緩沖對(duì)象對(duì)于這種操作來說很完美。

創(chuàng)建一個(gè)渲染緩沖對(duì)象和創(chuàng)建幀緩沖代碼差不多:

GLuint rbo;glGenRenderbuffers(1, &rbo);


相似地,我們打算把渲染緩沖對(duì)象綁定,這樣所有后續(xù)渲染緩沖操作都會(huì)影響到當(dāng)前的渲染緩沖對(duì)象:

?

glBindRenderbuffer(GL_RENDERBUFFER, rbo);

?

由于渲染緩沖對(duì)象通常是只寫的,它們經(jīng)常作為深度和模板附件來使用,由于大多數(shù)時(shí)候,我們不需要從深度和模板緩沖中讀取數(shù)據(jù),但仍關(guān)心深度和模板測(cè)試。我們就需要有深度和模板值提供給測(cè)試,但不需要對(duì)這些值進(jìn)行采樣(sample),所以深度緩沖對(duì)象是完全符合的。當(dāng)我們不去從這些緩沖中采樣的時(shí)候,渲染緩沖對(duì)象通常很合適,因?yàn)樗鼈兊扔谑潜粌?yōu)化過的。

?

調(diào)用glRenderbufferStorage函數(shù)可以創(chuàng)建一個(gè)深度和模板渲染緩沖對(duì)象:

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);

?

創(chuàng)建一個(gè)渲染緩沖對(duì)象與創(chuàng)建紋理對(duì)象相似,不同之處在于這個(gè)對(duì)象是專門被設(shè)計(jì)用于圖像的,而不是通用目的的數(shù)據(jù)緩沖,比如紋理。這里我們選擇GL_DEPTH24_STENCIL8作為內(nèi)部格式,它同時(shí)代表24位的深度和8位的模板緩沖。

?

最后一件還要做的事情是把幀緩沖對(duì)象附加上:

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);


在幀緩沖項(xiàng)目中,渲染緩沖對(duì)象可以提供一些優(yōu)化,但更重要的是知道何時(shí)使用渲染緩沖對(duì)象,何時(shí)使用紋理。通常的規(guī)則是,如果你永遠(yuǎn)都不需要從特定的緩沖中進(jìn)行采樣,渲染緩沖對(duì)象對(duì)特定緩沖是更明智的選擇。如果哪天需要從比如顏色或深度值這樣的特定緩沖采樣數(shù)據(jù)的話,你最好還是使用紋理附件。從執(zhí)行效率角度考慮,它不會(huì)對(duì)效率有太大影響。

?

?

下面通過案例的方式介紹如何使用幀緩存,我們會(huì)把場(chǎng)景渲染到一個(gè)顏色紋理上,這個(gè)紋理附加到一個(gè)我們創(chuàng)建的幀緩沖上,然后把紋

?

?

理繪制到一個(gè)簡(jiǎn)單的四邊形上,這個(gè)四邊形鋪滿整個(gè)屏幕。輸出的圖像看似和沒用幀緩沖一樣,但是這次,它其實(shí)是直接打印到了一個(gè)單獨(dú)的

四邊形上面。為什么這很有用呢?下一部分我們會(huì)看到原因。

第一件要做的事情是創(chuàng)建一個(gè)幀緩沖對(duì)象,并綁定它,這比較明了:

?

GLuint framebuffer;glGenFramebuffers(1, &framebuffer);glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

第二件要做的事情是我們創(chuàng)建一個(gè)紋理圖像,這是我們將要附加到幀緩沖的顏色附件。我們把紋理的尺寸設(shè)置為窗口的寬度和高度,并保持?jǐn)?shù)據(jù)未初始化:

?

?

?

?

// Generate textureGLuint texColorBuffer;glGenTextures(1, &texColorBuffer);glBindTexture(GL_TEXTURE_2D, texColorBuffer);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);glBindTexture(GL_TEXTURE_2D, 0);// Attach it to currently bound framebuffer objectglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);

我們同樣打算要讓OpenGL確定可以進(jìn)行深度測(cè)試(模板測(cè)試,如果你用的話)所以我們必須還要確保向幀緩沖中添加一個(gè)深度(和模板)

?

附件。由于我們只采樣顏色緩沖,并不采樣其他緩沖,我們可以創(chuàng)建一個(gè)渲染緩沖對(duì)象來達(dá)到這個(gè)目的。

創(chuàng)建一個(gè)渲染緩沖對(duì)象不太難。唯一一件要記住的事情是,我們正在創(chuàng)建的是一個(gè)渲染緩沖對(duì)象的深度和模板附件。我們把它的內(nèi)部給事設(shè)置

為GL_DEPTH24_STENCIL8,對(duì)于我們的目的來說這個(gè)精確度已經(jīng)足夠了。

GLuint rbo;glGenRenderbuffers(1, &rbo);glBindRenderbuffer(GL_RENDERBUFFER, rbo);glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);? glBindRenderbuffer(GL_RENDERBUFFER, 0);

?

我們?yōu)殇秩揪彌_對(duì)象分配了足夠的內(nèi)存空間以后,我們可以解綁渲染緩沖。

接著,在做好幀緩沖之前,還有最后一步,我們把渲染緩沖對(duì)象附加到幀緩沖的深度和模板附件上:

?

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);

?

然后我們要檢查幀緩沖是否真的做好了,如果沒有,我們就打印一個(gè)錯(cuò)誤消息。

?

?

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << endl;glBindFramebuffer(GL_FRAMEBUFFER, 0);

?

還要保證解綁幀緩沖,這樣我們才不會(huì)意外渲染到錯(cuò)誤的幀緩沖上。

現(xiàn)在幀緩沖做好了,我們要做的全部就是渲染到幀緩沖上,而不是綁定到幀緩沖對(duì)象的默認(rèn)緩沖。余下所有命令會(huì)影響到當(dāng)前綁定的幀緩沖上。所有深度和模板操作同樣會(huì)從當(dāng)前綁定的幀緩沖的深度和模板附件中讀取,當(dāng)然,得是在它們可用的情況下。如果你遺漏了比如深度緩沖,所有深度測(cè)試就不會(huì)工作,因?yàn)楫?dāng)前綁定的幀緩沖里沒有深度緩沖。

所以,為把場(chǎng)景繪制到一個(gè)單獨(dú)的紋理,我們必須以下面步驟來做:

  • 使用新的綁定為激活幀緩沖的幀緩沖,像往常那樣渲染場(chǎng)景。
  • 綁定到默認(rèn)幀緩沖。
  • 繪制一個(gè)四邊形,讓它平鋪到整個(gè)屏幕上,用新的幀緩沖的顏色緩沖作為他的紋理。
  • 為了繪制四邊形我們將會(huì)創(chuàng)建新的著色器。我們不打算引入任何花哨的變換矩陣,因?yàn)槲覀冎惶峁┮呀?jīng)是標(biāo)準(zhǔn)化設(shè)備坐標(biāo)的頂點(diǎn)坐標(biāo),所以我們可以直接把它們作為頂點(diǎn)著色器的輸出。頂點(diǎn)著色器看起來像這樣:

    ?

    #version 330 corelayout (location = 0) in vec2 position;layout (location = 1) in vec2 texCoords;out vec2 TexCoords;void main(){??? gl_Position = vec4(position.x, position.y, 0.0f, 1.0f);??? TexCoords = texCoords;}


    片段著色器更簡(jiǎn)潔,因?yàn)槲覀冏龅奈ㄒ灰患率菑募y理采樣:

    ?

    ?

    ?

    #version 330 corein vec2 TexCoords;out vec4 color;uniform sampler2D screenTexture;void main(){??? color = texture(screenTexture, TexCoords);}

    ?

    接著需要你為屏幕上的四邊形創(chuàng)建和配置一個(gè)VAO。渲染迭代中幀緩沖處理會(huì)有下面的結(jié)構(gòu):

    // First passglBindFramebuffer(GL_FRAMEBUFFER, framebuffer);glClearColor(0.1f, 0.1f, 0.1f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // We're not using stencil buffer nowglEnable(GL_DEPTH_TEST);DrawScene();// Second passglBindFramebuffer(GL_FRAMEBUFFER, 0); // back to defaultglClearColor(1.0f, 1.0f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);screenShader.Use();? glBindVertexArray(quadVAO);glDisable(GL_DEPTH_TEST);glBindTexture(GL_TEXTURE_2D, textureColorbuffer);glDrawArrays(GL_TRIANGLES, 0, 6);glBindVertexArray(0);

    ?

    第一,由于我們用的每個(gè)幀緩沖都有自己的一系列緩沖,我們打算使用glClear設(shè)置的合適的位(bits)來清空這些緩沖。

    ?

    第二,當(dāng)渲染四邊形的時(shí)候,我們關(guān)閉深度測(cè)試,因?yàn)槲覀儾魂P(guān)系深度測(cè)試,我們繪制的是一個(gè)簡(jiǎn)單的四邊形;當(dāng)我們繪制普通場(chǎng)景時(shí)我們必須再次開啟深度測(cè)試。實(shí)現(xiàn)效果如下所示:

    ?

    上述案例實(shí)現(xiàn)得出的結(jié)果是可以自由的獲取渲染場(chǎng)景中的任何像素,其實(shí)就是把它作為一個(gè)紋理圖像。接下來利用幀緩沖實(shí)現(xiàn)我們游戲中經(jīng)常使用的后處理效果,比如游戲中顏色的反相處理,就是把顏色值取反。這個(gè)在片段著色器中處理即可,在片段著色器里返回這些顏色的反色(Inversion)并不難。我們得到屏幕紋理的顏色,然后用1.0減去它:

    ?

    void main(){??? color = vec4(vec3(1.0 - texture(screenTexture, TexCoords)), 1.0);}

    反相是一種相對(duì)簡(jiǎn)單的后處理特效,實(shí)現(xiàn)的效果如下所示:

    ?


    ?

    這樣把整個(gè)場(chǎng)景都處理了,這也是后處理渲染實(shí)現(xiàn)的效果,這樣只需要在上述片段著色器中修改一行代碼即可實(shí)現(xiàn)。

    下面再繼續(xù)深入探討,在單獨(dú)紋理圖像上進(jìn)行后處理的另一個(gè)好處是我們可以從紋理的其他部分進(jìn)行采樣。比如我們可以從當(dāng)前紋理值的周圍采樣多個(gè)紋理值。創(chuàng)造性地把它們結(jié)合起來就能創(chuàng)造出有趣的效果了。

    kernel是一個(gè)長(zhǎng)得有點(diǎn)像一個(gè)小矩陣的數(shù)值數(shù)組,它中間的值中心可以映射到一個(gè)像素上,這個(gè)像素和這個(gè)像素周圍的值再乘以kernel,最后再把結(jié)果相加就能得到一個(gè)值。所以,我們基本上就是給當(dāng)前紋理坐標(biāo)加上一個(gè)它四周的偏移量,然后基于kernel把它們結(jié)合起來。下面是一個(gè)kernel的例子:

    這個(gè)kernel表示一個(gè)像素周圍八個(gè)像素乘以2,它自己乘以-15。這個(gè)例子基本上就是把周圍像素乘上2,中間像素去乘以一個(gè)比較大的負(fù)數(shù)來進(jìn)行平衡。kernel對(duì)于后處理來說非常管用,因?yàn)橛闷饋砗?jiǎn)單。網(wǎng)上能找到有很多實(shí)例,為了能用上kernel我們還得改改片段著色器。這里假設(shè)每個(gè)kernel都是3×3(實(shí)際上大多數(shù)都是3×3):

    ?

    const float offset = 1.0 / 300;? void main(){??? vec2 offsets[9] = vec2[](??????? vec2(-offset, offset),? // top-left??????? vec2(0.0f,??? offset),? // top-center??????? vec2(offset,? offset),? // top-right??????? vec2(-offset, 0.0f),??? // center-left??????? vec2(0.0f,??? 0.0f),??? // center-center??????? vec2(offset,? 0.0f),??? // center-right??????? vec2(-offset, -offset), // bottom-left??????? vec2(0.0f,??? -offset), // bottom-center??????? vec2(offset,? -offset)? // bottom-right??? );??? float kernel[9] = float[](??????? -1, -1, -1,??????? -1,? 9, -1,??????? -1, -1, -1??? );??? vec3 sampleTex[9];??? for(int i = 0; i < 9; i++)??? {??????? sampleTex[i] = vec3(texture(screenTexture, TexCoords.st + offsets[i]));??? }??? vec3 col;??? for(int i = 0; i < 9; i++)??????? col += sampleTex[i] * kernel[i];??? color = vec4(col, 1.0);}

    ?

    ?

    在片段著色器中我們先為每個(gè)四周的紋理坐標(biāo)創(chuàng)建一個(gè)9個(gè)vec2偏移量的數(shù)組。偏移量是一個(gè)簡(jiǎn)單的常數(shù),你可以設(shè)置為自己喜歡的。接著我們定義kernel,這里應(yīng)該是一個(gè)銳化kernel,它通過一種有趣的方式從所有周邊的像素采樣,對(duì)每個(gè)顏色值進(jìn)行銳化。最后,在采樣的時(shí)候我們把每個(gè)偏移量加到當(dāng)前紋理坐標(biāo)上,然后用加在一起的kernel的值乘以這些紋理值。

    這個(gè)銳化的kernel看起來像這樣:

    再舉個(gè)例子關(guān)于模糊(Blur)效果的Kernel定義如下:

    由于所有數(shù)值加起來的總和為16,簡(jiǎn)單返回結(jié)合起來的采樣顏色是非常亮的,所以我們必須將kernel的每個(gè)值除以16.最終的kernel數(shù)組會(huì)是這樣的:

    ?

    float kernel[9] = float[](??? 1.0 / 16, 2.0 / 16, 1.0 / 16,??? 2.0 / 16, 4.0 / 16, 2.0 / 16,??? 1.0 / 16, 2.0 / 16, 1.0 / 16? );

    通過在像素著色器中改變kernel的float數(shù)組,我們就完全改變了之后的后處理效果.現(xiàn)在看起來會(huì)像是這樣:

    ?


    ?

    這樣的模糊效果具有創(chuàng)建許多有趣效果的潛力,模糊效果在后處理中使用的非常多,它會(huì)結(jié)合著Bloom后處理渲染使用。模糊也能為我們?cè)诤竺娴慕坛讨刑峁┒碱伾颠M(jìn)行平滑處理的能力。

    最后把關(guān)于幀緩沖的頂點(diǎn)著色器和片段著色器代碼分別給讀者展示如下:

    頂點(diǎn)著色器代碼:

    ?

    #version 330 corelayout (location = 0) in vec2 position;layout (location = 1) in vec2 texCoords;out vec2 TexCoords;void main(){??? gl_Position = vec4(position.x, position.y, 0.0f, 1.0f);???? TexCoords = texCoords;}


    片段著色器代碼如下所示:

    ?

    ?

    #version 330 corein vec2 TexCoords;out vec4 color;uniform sampler2D screenTexture;const float offset = 1.0 / 300;? void main(){??? vec2 offsets[9] = vec2[](??????? vec2(-offset, offset),? // top-left??????? vec2(0.0f,??? offset),? // top-center??????? vec2(offset,? offset),? // top-right??????? vec2(-offset, 0.0f),??? // center-left??????? vec2(0.0f,??? 0.0f),??? // center-center??????? vec2(offset,? 0.0f),??? // center-right??????? vec2(-offset, -offset), // bottom-left??????? vec2(0.0f,??? -offset), // bottom-center??????? vec2(offset,? -offset)? // bottom-right??? ??? );??? float kernel[9] = float[](??????? -1, -1, -1,??????? -1,? 9, -1,??????? -1, -1, -1??? );??????? vec3 sampleTex[9];??? for(int i = 0; i < 9; i++)??? {??????? sampleTex[i] = vec3(texture(screenTexture, TexCoords.st + offsets[i]));??? }??? vec3 col;??? for(int i = 0; i < 9; i++)??????? col += sampleTex[i] * kernel[i];??????? color = vec4(col, 1.0);}

    另外把在C++中關(guān)于處理幀緩存的核心代碼給讀者展示如下:

    ?

    ?

    // Setup cube VAO??? GLuint cubeVAO, cubeVBO;??? glGenVertexArrays(1, &cubeVAO);??? glGenBuffers(1, &cubeVBO);??? glBindVertexArray(cubeVAO);??? glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);??? glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertices), &cubeVertices, GL_STATIC_DRAW);??? glEnableVertexAttribArray(0);??? glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);??? glEnableVertexAttribArray(1);??? glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));??? glBindVertexArray(0);??? // Setup plane VAO??? GLuint floorVAO, floorVBO;??? glGenVertexArrays(1, &floorVAO);??? glGenBuffers(1, &floorVBO);??? glBindVertexArray(floorVAO);??? glBindBuffer(GL_ARRAY_BUFFER, floorVBO);??? glBufferData(GL_ARRAY_BUFFER, sizeof(floorVertices), &floorVertices, GL_STATIC_DRAW);??? glEnableVertexAttribArray(0);??? glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);??? glEnableVertexAttribArray(1);??? glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));??? glBindVertexArray(0);??? // Setup screen VAO??? GLuint quadVAO, quadVBO;??? glGenVertexArrays(1, &quadVAO);??? glGenBuffers(1, &quadVBO);??? glBindVertexArray(quadVAO);??? glBindBuffer(GL_ARRAY_BUFFER, quadVBO);??? glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);??? glEnableVertexAttribArray(0);??? glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)0);??? glEnableVertexAttribArray(1);??? glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat)));??? glBindVertexArray(0);??? // Load textures??? GLuint cubeTexture = loadTexture(FileSystem::getPath("resources/textures/container.jpg").c_str());??? GLuint floorTexture = loadTexture(FileSystem::getPath("resources/textures/metal.png").c_str());??? #pragma endregion??? // Framebuffers??? GLuint framebuffer;??? glGenFramebuffers(1, &framebuffer);??? glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);????? // Create a color attachment texture??? GLuint textureColorbuffer = generateAttachmentTexture(false, false);??? glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0);??? // Create a renderbuffer object for depth and stencil attachment (we won't be sampling these)??? GLuint rbo;??? glGenRenderbuffers(1, &rbo);??? glBindRenderbuffer(GL_RENDERBUFFER, rbo);???? glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, screenWidth, screenHeight); // Use a single renderbuffer object for both a depth AND stencil buffer.??? glBindRenderbuffer(GL_RENDERBUFFER, 0);??? glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); // Now actually attach it??? // Now that we actually created the framebuffer and added all attachments we want to check if it is actually complete now??? if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)??????? cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << endl;??? glBindFramebuffer(GL_FRAMEBUFFER, 0);


    每一幀處理的代碼如下所示:

    ?

    ?

    ??????? /??????? // Bind to framebuffer and draw to color texture ??????? // as we normally would.??????? // //??????? glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);??????? // Clear all attached buffers??????? ??????? glClearColor(0.1f, 0.1f, 0.1f, 1.0f);??????? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // We're not using stencil buffer so why bother with clearing???????? glEnable(GL_DEPTH_TEST);??????? // Set uniforms??????? shader.Use();??????? glm::mat4 model;??????? glm::mat4 view = camera.GetViewMatrix();??????? glm::mat4 projection = glm::perspective(camera.Zoom, (float)screenWidth/(float)screenHeight, 0.1f, 100.0f);??????? glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));??????? glUniformMatrix4fv(glGetUniformLocation(shader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection));??????? // Floor??????? glBindVertexArray(floorVAO);??????? glBindTexture(GL_TEXTURE_2D, floorTexture);??????? model = glm::mat4();??????? glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));??????? glDrawArrays(GL_TRIANGLES, 0, 6);????????? glBindVertexArray(0);???????? // Cubes??????? glBindVertexArray(cubeVAO);??????? glBindTexture(GL_TEXTURE_2D, cubeTexture);????????? model = glm::translate(model, glm::vec3(-1.0f, 0.0f, -1.0f));??????? glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));??????? glDrawArrays(GL_TRIANGLES, 0, 36);??????? model = glm::mat4();??????? model = glm::translate(model, glm::vec3(2.0f, 0.0f, 0.0f));??????? glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));??????? glDrawArrays(GL_TRIANGLES, 0, 36);??????? glBindVertexArray(0);?????????? /??????? // Bind to default framebuffer again and draw the ??????? // quad plane with attched screen texture.??????? // //??????? glBindFramebuffer(GL_FRAMEBUFFER, 0);??????? // Clear all relevant buffers??????? glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Set clear color to white (not really necessery actually, since we won't be able to see behind the quad anyways)??????? glClear(GL_COLOR_BUFFER_BIT);??????? glDisable(GL_DEPTH_TEST); // We don't care about depth information when rendering a single quad??????? // Draw Screen??????? screenShader.Use();??????? glBindVertexArray(quadVAO);??????? glBindTexture(GL_TEXTURE_2D, textureColorbuffer); // Use the color attachment texture as the texture of the quad plane??????? glDrawArrays(GL_TRIANGLES, 0, 6);??????? glBindVertexArray(0);??????? // Swap the buffers??????? glfwSwapBuffers(window);

    ?

    ?

    總結(jié):
    以上就是關(guān)于幀緩沖的介紹,它主要的作用是可以獲取到場(chǎng)景像素,后處理就是對(duì)場(chǎng)景像素作渲染處理的,所以該技術(shù)廣泛的被應(yīng)用在后處理開發(fā)中,這也是為讀者揭示后處理渲染的本質(zhì),希望對(duì)大家有所幫助。。。。。

    ?

    ?

    ?

    ?

    ?

    ???????????

    瀏覽人工智能教程

    總結(jié)

    以上是生活随笔為你收集整理的转 OpenGL核心技术之帧缓冲的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    久久艹人人 | 日韩欧美在线免费 | 美女黄久久 | 六月色婷| 人人插人人爱 | 精品久久久久一区二区国产 | 又黄又爽又色无遮挡免费 | www.啪啪.com | 99久久99久久 | 亚洲精品免费观看 | 99色在线播放 | 激情视频免费在线 | 五月天av在线 | 91精品在线免费观看视频 | 五月网婷婷 | 精品特级毛片 | 亚洲精品国产欧美在线观看 | 久久久午夜精品福利内容 | 成人黄色一级视频 | 国产精品久久电影网 | 国产特级毛片aaaaaa | 免费一区在线 | 天天综合网 天天综合色 | 日韩高清久久 | 人人干人人爽 | 精品福利视频在线 | 亚洲美女精品区人人人人 | 9999精品免费视频 | 中文视频在线看 | 国内精品毛片 | 国产在线免费观看 | 999日韩| 日日夜夜精品网站 | 欧美怡红院视频 | 黄色免费在线视频 | 国产精品欧美日韩 | 久久久综合精品 | 国产视频91在线 | 玖玖爱国产在线 | 在线亚洲观看 | 久久精品一区二区三区视频 | 亚洲黄色片一级 | 少妇激情久久 | 国产小视频在线免费观看视频 | 丁香高清视频在线看看 | 亚洲国产成人av网 | 亚洲激情视频在线观看 | 99精品观看 | 亚洲精品久久久久久久不卡四虎 | 国内精品久久久久久久久久清纯 | 中文字幕第一页在线 | 日日干精品 | 日韩精品视频在线免费观看 | 伊人天天狠天天添日日拍 | 日韩免费视频在线观看 | 黄色大片日本 | 精品国产乱子伦一区二区 | 国产毛片久久 | 日韩精品1区2区 | 在线观看日韩免费视频 | 国产黄色免费观看 | 黄网站www | 国产福利在线不卡 | 天天翘av | 在线观看国产区 | 日本久久精品 | 国产亚洲综合在线 | 久久久久这里只有精品 | 久久免费精品 | 亚洲国产美女久久久久 | 婷婷久久网 | 国产黄色片免费看 | 91看片在线观看 | 色av男人的天堂免费在线 | 久久久久日本精品一区二区三区 | 亚洲成a人片在线观看网站口工 | 亚洲精品一区二区在线观看 | 国产精品99久久久久久宅男 | 中国美女一级看片 | 香蕉视频在线免费 | 99视频国产精品 | 99精品国产99久久久久久97 | 亚洲国产中文字幕 | 亚洲精品动漫在线 | 亚洲精品中文字幕视频 | 99精品色 | 成人夜晚看av | 国产精品系列在线播放 | 韩国av一区二区三区 | 国内精品久久久久久 | 久久天天操| 成年人免费看片网站 | 绯色av一区 | 美女视频黄免费 | 2019中文字幕第一页 | 91色视频 | 欧美性猛片, | 手机色站 | 成人三级黄色 | 国产一区二区精品久久 | 91亚洲网 | 精品国产免费一区二区三区五区 | 美女视频久久黄 | 亚洲天堂网在线视频 | 亚洲精品视频二区 | 日韩高清久久 | 四虎影视欧美 | 999视频网站 | 在线观看中文字幕视频 | 国产日韩在线观看一区 | 狠狠干天天操 | 日本精品一区二区三区在线观看 | 69国产成人综合久久精品欧美 | 日韩av免费观看网站 | 国产一区二区中文字幕 | 久久久久成人精品亚洲国产 | 日韩三级视频在线观看 | 国产免费又爽又刺激在线观看 | 日本少妇久久久 | 亚洲免费在线观看视频 | 久草com | 91精品国产99久久久久久久 | 日韩高清不卡一区二区三区 | 最近最新最好看中文视频 | 国产亚洲婷婷免费 | 一级成人网 | 欧美成人按摩 | av一区在线 | 久久久久99精品成人片三人毛片 | 91视频在线免费看 | 亚洲激情 欧美激情 | 国产精品一区二区吃奶在线观看 | 色综合天天综合在线视频 | 91资源在线播放 | 国产1区在线观看 | 狠狠干网站 | www.99在线观看 | 最新中文字幕视频 | 天天亚洲综合 | 99久久激情视频 | 97精品超碰一区二区三区 | 99久久精品国产观看 | 三级av在线免费观看 | av免费观看网址 | av在线永久免费观看 | av手机在线播放 | a v在线观看 | 激情电影在线观看 | 91麻豆国产福利在线观看 | 国产日韩欧美在线播放 | 久久久久女人精品毛片九一 | 色综合天天视频在线观看 | 永久免费av在线播放 | 在线中文字幕网站 | 欧美成人xxxxxxxx | 日韩av资源站 | 亚洲综合涩 | 欧美日韩在线免费观看 | 97精品国产97久久久久久粉红 | 国产123区在线观看 国产精品麻豆91 | av免费观看网址 | 日韩欧美在线高清 | 中文字幕在线国产 | 久久人人爽爽人人爽人人片av | 日韩丝袜在线 | 国产精品刺激对白麻豆99 | 日韩中文字幕免费在线播放 | 在线国产一区 | 国产精品视频永久免费播放 | 欧美99久久| 日韩电影一区二区三区 | 国产精品一区二区久久精品爱涩 | 天天夜夜操 | 九九九九九精品 | 亚洲精品自拍视频在线观看 | 国产精品美女久久久 | 亚洲国产精品va在线 | 天堂网一区| 欧美日产在线观看 | 国产日韩精品视频 | 成人av在线播放网站 | 久久国产三级 | 欧美午夜精品久久久久久孕妇 | 麻豆果冻剧传媒在线播放 | 成片视频免费观看 | 日韩激情片在线观看 | 国产精品久久久一区二区三区网站 | www.亚洲黄色 | aa级黄色大片 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲天堂免费视频 | 日夜夜精品视频 | 亚洲狠狠干 | 久久亚洲精品电影 | 亚洲精品色 | 精品福利视频在线 | 欧美激情第一区 | 在线观看精品 | a黄色片在线观看 | 国产成人一区二区三区电影 | 亚洲欧美怡红院 | 久久99久久99精品免费看小说 | 91九色精品国产 | 久久久久久黄 | 国产精品自产拍在线观看蜜 | 国产二级视频 | 亚洲一片黄 | 中文字幕免费成人 | 1024久久| av不卡网站 | 欧美视频18| 午夜美女福利直播 | 99久久精品一区二区成人 | 99视频在线精品免费观看2 | 六月丁香久久 | 亚洲va欧美va | 91在线视频在线 | 在线欧美最极品的av | 亚洲一区二区观看 | av免费在线网站 | 欧美另类色图 | 亚洲精品一区二区网址 | 欧美少妇的秘密 | 亚洲高清视频一区二区三区 | 久久免费视频8 | 夜夜躁日日躁狠狠久久88av | 国产精品久久久久久久电影 | 九九九热精品免费视频观看网站 | 91色蜜桃| 天天射天天拍 | 人人爽人人| 国产精品免费一区二区三区在线观看 | 日韩性色 | 亚洲电影自拍 | 丁香五月网久久综合 | www.亚洲精品视频 | 96国产精品视频 | 久久免费视频网 | 日本成人中文字幕在线观看 | 亚洲视频,欧洲视频 | 亚洲成人网av | 亚洲免费公开视频 | 国产又粗又猛又黄 | 深夜免费福利网站 | 国产精品美女久久久久久免费 | 91精品国产91久久久久福利 | 久碰视频在线观看 | 午夜10000 | 国产麻豆果冻传媒在线观看 | 亚洲www天堂com | 日本三级吹潮在线 | 99爱在线 | 亚洲综合在线五月天 | 992tv在线成人免费观看 | 欧美一级电影在线观看 | 国产97视频在线 | 国产精品1000| 久久开心激情 | 国产不卡一区二区视频 | 国产精品欧美精品 | 96av麻豆蜜桃一区二区 | 欧美日韩视频在线观看免费 | 丝袜美腿亚洲综合 | 天天操天天怕 | 在线看片一区 | 久久免费视频在线观看 | 操久 | 久久亚洲欧美 | 精品国产免费观看 | 亚洲精品视频在线观看网站 | 日韩在线观看一区二区 | 国产一区二区三区免费在线 | 久久久鲁| 国产午夜在线观看 | 亚洲日本精品视频 | 国产精品不卡在线播放 | 天堂麻豆| 免费观看第二部31集 | 狠狠操狠狠干2017 | 蜜臀久久99精品久久久无需会员 | 国产亚洲精品久久 | 一区二区三区国产欧美 | 欧美一二区在线 | a在线免费 | 亚洲女在线 | 亚洲综合色激情五月 | 久久一二三四 | 久久不卡电影 | 欧美色图30p| 日韩在观看线 | 国产亚洲精品综合一区91 | 国产精品久久久久久久久蜜臀 | 免费精品人在线二线三线 | 国内丰满少妇猛烈精品播 | 涩涩成人在线 | 午夜精品电影 | 又爽又黄又无遮挡网站动态图 | 久久精品婷婷 | 成人av在线影院 | 欧美在线你懂的 | 免费观看v片在线观看 | 天天操天天干天天干 | 日本中文字幕在线播放 | 欧美另类高清 | 久久免费视频1 | 在线观看a视频 | 揉bbb玩bbb少妇bbb| 久草在线视频在线 | 天天色天| 天堂av网址| 亚洲精品乱码久久久久久蜜桃不爽 | 久热免费在线 | 久久五月天色综合 | 毛片无卡免费无播放器 | japanesefreesex中国少妇 | 丁香 婷婷 激情 | 国产精品刺激对白麻豆99 | 97在线免费 | 中文字幕在线视频免费播放 | 久久久久激情电影 | 成av人电影 | 久久精品福利视频 | 欧美成人亚洲 | 久久综合电影 | 夜夜躁日日躁狠狠久久av | 精品久久久久久久久中文字幕 | 成年人国产精品 | 日批在线观看 | 天天操天天摸天天爽 | 精品麻豆| 久久99久久99精品免观看软件 | 91传媒在线播放 | 激情视频在线高清看 | 91天堂在线观看 | 婷婷干五月| 中文字幕在线视频国产 | 日韩av免费观看网站 | 99精品在线观看视频 | 精品久久久久久一区二区里番 | 六月天综合网 | 精品久久久久久一区二区里番 | 这里只有精彩视频 | 日韩videos高潮hd | 热99在线 | 欧美日韩国产精品一区二区亚洲 | 亚洲黄色高清 | 亚洲精品h| 天天干夜夜擦 | 久久成人精品视频 | 五月花婷婷 | 国产97碰免费视频 | 欧美专区亚洲专区 | 久久精品久久久久久久 | 日本精品中文字幕在线观看 | 久久久久久片 | 国产精品久久久久婷婷二区次 | 91色亚洲 | 国产激情电影综合在线看 | 亚洲国产中文字幕在线观看 | 日韩av资源在线观看 | 五月激情姐姐 | 懂色av懂色av粉嫩av分享吧 | 91在线精品一区二区 | 超碰在线个人 | 99一级片| 婷婷精品 | 国产99中文字幕 | 国产精品久久中文字幕 | 久久99网站 | 99精品免费久久久久久日本 | 狠狠色丁香婷婷综合视频 | 国产一区二区高清不卡 | 婷婷成人亚洲综合国产xv88 | 国产一区免费视频 | 五月婷婷在线视频观看 | 色欧美88888久久久久久影院 | 91系列在线观看 | 免费在线看v| 国产高清在线一区 | 中文字幕一区二区三区在线观看 | 日韩在线观看视频一区二区三区 | 久久精品99国产国产精 | 国产成人一二片 | 国产午夜三级一二三区 | 日韩乱码在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 精品一区在线 | 91在线免费观看网站 | 久久久久久久久久久久国产精品 | 最新动作电影 | 一区二区三区视频在线 | 有码中文字幕在线观看 | 久久综合九九 | 麻豆国产视频下载 | 午夜黄色一级片 | 亚洲1区 在线 | 97人人射| 97超碰精品 | 国产精品资源在线观看 | 欧美成人影音 | 九九久久成人 | 国产一级电影 | bbbb操bbbb | 中文字幕资源网 国产 | 久久国内精品视频 | 国产成人精品一区二区 | 一级黄色片毛片 | 一本一道久久a久久精品蜜桃 | 久草视频中文在线 | 在线观看的黄色 | 久草视频在线资源 | 日本精品视频网站 | 免费亚洲视频 | 麻豆av一区二区三区在线观看 | 亚洲国产中文字幕 | 性色av一区二区三区在线观看 | 国产视频1 | 国内精品久久影院 | 中文字幕一区2区3区 | 久久免费福利 | 91精品国产91久久久久福利 | 亚洲精品久久久久999中文字幕 | 最近2019年日本中文免费字幕 | 国产日产精品一区二区三区四区 | 免费开视频 | 一区二区精品在线视频 | 黄色高清视频在线观看 | 成人免费视频网站在线观看 | 欧美日韩国产伦理 | 国产一区免费在线 | 亚洲国产97在线精品一区 | 欧美日韩国产二区三区 | 亚洲在线网址 | 二区视频在线观看 | 成人影音av| 91精品国产自产老师啪 | 色视频网址| 久久精品观看 | 日韩精品一区电影 | 中文字幕a在线 | 一区二区电影在线观看 | 999视频在线播放 | 波多野结衣综合网 | 91粉色视频| 日本高清久久久 | 久久99精品久久久久久清纯直播 | 96av在线| 黄色免费大片 | 在线免费观看欧美日韩 | 久久精品中文 | av在线免费网站 | 手机看片国产 | 4438全国亚洲精品观看视频 | 最近日韩免费视频 | 在线观看视频h | 免费看一级一片 | 人人澡超碰碰 | 久久99亚洲精品久久 | 精品免费视频123区 午夜久久成人 | 成人小电影在线看 | 国产看片免费 | 人人搞人人干 | 久久撸在线视频 | 91在线免费播放视频 | 亚洲精品视频在线免费播放 | 97免费中文视频在线观看 | 久久免费视频一区 | 色播亚洲婷婷 | 日韩精品一卡 | 最近2019好看的中文字幕免费 | 国产视频1区2区3区 久久夜视频 | 很黄很色很污的网站 | 91麻豆传媒 | av在线电影播放 | 久久一区二区三区超碰国产精品 | 国产美女久久久 | a级国产乱理论片在线观看 伊人宗合网 | 国产高清视频网 | 成人av一级片 | 在线观看日韩精品 | 亚洲精品在线免费观看视频 | 久久久成人精品 | 97色在线观看 | 久久久久久久久爱 | 网站在线观看你们懂的 | 国产精品第一视频 | 国产一区二区在线播放视频 | 三级在线视频播放 | 91亚洲欧美 | 国产视频精品免费播放 | 久久久久久中文字幕 | 一区二区精品在线 | 天天干天天色2020 | 亚洲人毛片 | 免费电影一区二区三区 | 国产精品手机在线播放 | 国产精品一区二区三区久久久 | 午夜精品一区二区三区免费 | 97精品国产 | 天天干 天天摸 天天操 | 亚洲欧美视频一区二区三区 | 六月丁香在线观看 | 一区二区视频欧美 | 黄色精品久久久 | 中文理论片 | 国产人成在线视频 | 国产女人18毛片水真多18精品 | 一区二区视频电影在线观看 | 在线激情小视频 | 亚洲高清视频在线观看免费 | 4438全国亚洲精品在线观看视频 | 麻豆91在线 | 国产精品久久久久久久久久免费 | 国产v欧美 | 中文字幕中文字幕在线一区 | 狠狠躁日日躁狂躁夜夜躁 | 日韩理论片在线观看 | 综合久久久久久 | 成人一级视频在线观看 | 国产三级在线播放 | 免费看一级特黄a大片 | 国产黄网站在线观看 | 日韩电影在线一区二区 | 色婷婷丁香 | 97在线精品国自产拍中文 | 8090yy亚洲精品久久 | 国产精品久久久久久久久免费看 | 久久久福利视频 | 国产69精品久久久久9999apgf | 亚洲综合成人婷婷小说 | 久久免费激情视频 | 亚洲国产理论片 | 精品视频97| 中日韩欧美精彩视频 | 国产99亚洲 | 高清在线一区 | 一区二区三区四区五区在线 | 丁香激情综合 | 免费一级特黄录像 | 久久这里有精品 | 天天操天天干天天操天天干 | 人人讲下载 | 三级性生活视频 | www.久久com| 免费开视频 | 99国产精品久久久久老师 | 日韩在线视频免费观看 | 手机成人av在线 | 成人中文字幕在线 | 亚洲一级片免费观看 | 精品美女久久久久久免费 | 免费在线色视频 | 亚洲天堂网在线观看视频 | 欧美精品资源 | 99精品欧美一区二区三区黑人哦 | 嫩模bbw搡bbbb搡bbbb | 六月丁香六月婷婷 | 999免费视频| 又黄又爽又无遮挡免费的网站 | 偷拍福利视频一区二区三区 | 亚洲一级二级 | 久久九九国产视频 | 欧美日韩国产一区二区三区在线观看 | 欧美一级片免费 | 伊人久久在线观看 | 国产一级二级在线播放 | 精品久久久久久久久久 | 国产成人精品不卡 | 最新av在线网站 | 日韩久久精品一区二区三区 | 久久久久久久久久久久久影院 | 天天天操天天天干 | 五月激情在线 | 欧美一区二区精美视频 | 天天色成人网 | 99综合电影在线视频 | 男女全黄一级一级高潮免费看 | 日本丰满少妇免费一区 | 视频在线观看入口黄最新永久免费国产 | 国产一级做a爱片久久毛片a | 成av人电影| 久久视频精品在线 | 狠狠插狠狠操 | 国产乱老熟视频网88av | 免费观看成人网 | 一本色道久久精品 | 中文字幕美女免费在线 | 国产黄色片免费在线观看 | 91久久久久久久一区二区 | 成人黄色短片 | 国产永久免费高清在线观看视频 | 天天色天天爱天天射综合 | 亚洲国产一区二区精品专区 | 国产不卡在线播放 | 国产精品美女免费 | 色网免费观看 | 97夜夜澡人人爽人人免费 | 国产超碰在线观看 | 日韩av免费一区二区 | 97精品欧美91久久久久久 | 在线不卡中文字幕播放 | 九九爱免费视频 | 一区二区三区精品久久久 | 欧美一区中文字幕 | 日本精品一区二区三区在线观看 | 精品久久久久久久久久久久久久久久 | 久久国产精品久久国产精品 | 91片黄在线观看动漫 | 国产无套一区二区三区久久 | 亚洲成人av电影 | 黄色网址国产 | 成人黄色毛片 | 日韩中文字幕在线看 | 中文av网 | 国产精品久久久久久影院 | 欧美午夜寂寞影院 | 日韩欧美在线综合网 | 99免费看片 | 依人成人综合网 | 国产精品一区二区三区观看 | 久久精品国产一区 | 黄色在线免费观看网站 | 国产在线播放一区二区三区 | 精品免费视频. | av福利免费 | 激情图片久久 | 在线免费观看视频一区二区三区 | 亚洲男男gⅴgay双龙 | 国产精品视频线看 | 午夜精品一区二区三区在线视频 | 欧美做受高潮1 | 岛国av在线不卡 | 91亚洲欧美激情 | 美女福利视频一区二区 | 激情动态 | 日韩精品免费一区二区在线观看 | 国产在线播放不卡 | av观看久久久 | 欧美夫妻生活视频 | 亚洲精品国产精品国自产观看浪潮 | 亚洲黄色在线观看 | 成人免费视频a | 天天干天天操天天做 | 一区二区三区四区五区六区 | 成人黄色免费在线观看 | 色狠狠久久av五月综合 | 成人在线播放视频 | 日韩首页 | 国产在线观看你懂的 | 国产精品6| 亚洲午夜精品电影 | 在线观看的a站 | 中文字幕 在线看 | 2018亚洲男人天堂 | 97在线影视 | 黄色大全免费观看 | 国产a级片免费观看 | 亚洲欧美视频在线播放 | 香蕉蜜桃视频 | 久久福利在线 | 日日干干夜夜 | 又黄又爽又色无遮挡免费 | 欧美大片在线看免费观看 | 日日日爽爽爽 | 夜夜躁狠狠躁日日躁 | 日韩高清三区 | 国产成人一区二区三区免费看 | 国产精品女主播一区二区三区 | 一区 二区 精品 | 日韩av一区二区三区四区 | 97av视频在线观看 | 最近中文字幕大全中文字幕免费 | 五月婷婷综合久久 | 狠狠干美女 | 国产午夜精品一区二区三区四区 | 91精品视频一区 | 国产亚洲视频在线免费观看 | 精品黄色在线 | 99夜色 | 黄色一区二区在线观看 | 国产午夜三级一二三区 | 夜夜躁日日躁狠狠久久av | 久久久精品影视 | 国产精品免费一区二区三区在线观看 | 亚洲黄色免费在线 | 成人av手机在线 | 欧美一区二区免费在线观看 | 久久综合加勒比 | 天天操天天射天天爱 | 国产精品18久久久久久首页狼 | 国产精品女同一区二区三区久久夜 | 日韩在线观看av | 亚洲免费在线播放视频 | 天天干天天操人体 | 精品久久免费看 | 久草网免费 | 懂色av懂色av粉嫩av分享吧 | 五月天欧美精品 | 日韩成人免费在线 | 午夜国产在线观看 | 在线免费观看黄色小说 | 日本特黄特色aaa大片免费 | 99热在线观看免费 | 国产欧美精品一区二区三区四区 | 亚洲在线色 | 欧洲精品二区 | 97香蕉久久超级碰碰高清版 | 在线观看日本高清mv视频 | 免费久久99精品国产婷婷六月 | 在线精品亚洲 | 欧美不卡视频在线 | 免费在线观看91 | 久久久成人精品 | 91精品国产综合久久婷婷香蕉 | 视频国产 | 欧美日韩网站 | 波多野结衣一区二区 | 中文字幕在线一区二区三区 | 日韩欧美精选 | 久久精品福利视频 | 欧美久久久久 | 国产精品自产拍在线观看中文 | 日韩免费看片 | 蜜臀久久99精品久久久无需会员 | 狠狠色伊人亚洲综合成人 | 成人毛片网 | 91看片淫黄大片在线播放 | 午夜视频播放 | 国产精品黄色 | 狠色狠色综合久久 | 亚洲播放一区 | 国产一二三在线视频 | 欧美ⅹxxxxxx | 日韩精品免费一区二区在线观看 | 色综合中文字幕 | 99视频在线精品国自产拍免费观看 | 久久99久久久久 | 欧美性黑人| 精品久久久久国产免费第一页 | 在线国产中文字幕 | www国产亚洲 | 精品国产亚洲日本 | 99视频在线观看一区三区 | 在线成人短视频 | www.久久免费视频 | 激情久久久 | aaa亚洲精品一二三区 | 五月天com | 不卡视频一区二区三区 | 成人动漫一区二区三区 | 久久久久区| 亚洲一区二区三区在线看 | 三级视频国产 | 99国产视频 | 麻豆va一区二区三区久久浪 | 一区二区不卡视频在线观看 | 狂野欧美激情性xxxx | 国产精品乱码久久久久久1区2区 | 91禁在线看 | 婷婷丁香九月 | 免费av观看 | 国产亚洲精品久久久久久无几年桃 | 欧美色图亚洲图片 | 在线免费视频一区 | 国产在线不卡 | 亚洲高清精品在线 | 日韩伦理片一区二区三区 | 欧美在线a视频 | 人人爽人人爽人人片av | 亚洲欧美日韩精品久久奇米一区 | 欧美不卡在线 | www色av| 色吊丝在线永久观看最新版本 | 中文字幕在线播放日韩 | 在线观看视频精品 | 午夜国产一区 | 91专区在线观看 | 91在线看| 婷婷中文字幕综合 | 青草视频在线免费 | 国产美女黄网站免费 | 免费91麻豆精品国产自产在线观看 | 婷婷激情网站 | 精品国产一二三 | 91在线91 | 国产69精品久久99的直播节目 | 奇米四色影狠狠爱7777 | 99久久精品国产一区二区三区 | 国产麻豆电影在线观看 | 国产精品网红直播 | 亚洲一级在线观看 | 麻豆视传媒官网免费观看 | 亚洲黄a | 中文字幕在线观看亚洲 | 欧美日韩中文字幕视频 | 91在线色| 国产视频1区2区 | 精品一区二区电影 | 日本精品久久久久影院 | 97超碰人人澡人人爱学生 | 午夜10000 | www久久 | 色综合久久综合 | 91mv.cool在线观看 | 久久国产精品成人免费浪潮 | 亚洲成人免费在线观看 | 成人免费在线观看电影 | 久久久久久国产精品美女 | av电影免费看 | 国产免费av一区二区三区 | 久久成人国产精品 | 国精产品满18岁在线 | 国内精品福利视频 | 中文字幕一区二区三区四区久久 | 在线视频 国产 日韩 | 蜜桃视频在线视频 | 毛片视频网址 | 91视频3p| 国产精品毛片久久久 | 一区二区三区在线免费观看视频 | 中文字幕在线观看91 | 久久久国产一区二区三区四区小说 | 一区二区国产精品 | 国产麻豆剧传媒免费观看 | 久久久精品福利视频 | 亚洲欧美日韩精品久久久 | 综合亚洲视频 | 欧美一级免费黄色片 | 黄网站www | 91福利小视频 | 国产91在线免费视频 | 日韩中文字幕免费 | 久久草av | 在线播放你懂 | 国产做a爱一级久久 | 久久精品美女视频网站 | 亚洲人成精品久久久久 | 在线性视频日韩欧美 | 亚洲成人动漫在线观看 | 在线精品在线 | 91视频亚洲 | 欧美成人精品欧美一级乱 | 亚洲三级在线免费观看 | 亚洲国产日韩一区 | av综合网址 | 国产69久久 | 久久久久99999 | 国产色啪 | 亚洲免费专区 | 最新国产在线 | 国产福利一区二区在线 | 久久国产精彩视频 | 午夜黄色一级片 | 欧美日一级片 | 美女黄视频免费看 | 超碰日韩 | 国产精品视频在线观看 | 高清一区二区 | 久久国产一区二区三区 | 黄色小说免费在线观看 | 国内成人综合 | 久久久久欧美精品999 | 欧美一区免费观看 | 日韩av电影手机在线观看 | 亚洲欧美日韩国产精品一区午夜 | 国产裸体bbb视频 | 国产精品入口麻豆 | 九草在线观看 | 欧美一级免费 | 亚洲一区二区三区在线看 | 日韩色一区二区三区 | 一区二区三区免费在线 | 中文字幕一二三区 | 国产精品永久久久久久久久久 | 天天躁天天躁天天躁婷 | 911国产| 国产午夜精品一区二区三区 | a在线播放| 久久99精品久久久久久三级 | 色开心| 99精品视频在线播放免费 | 91丨九色丨高潮丰满 | 99re视频在线观看 | 婷婷综合导航 | 五月天九九 | 午夜精品在线看 | 国产视频在线看 | 毛片在线播放网址 | 操碰av | 色网站免费在线看 | 久久成人国产精品入口 | 中文亚洲欧美日韩 | 中文字幕视频观看 | 五月天婷婷在线播放 | 天天插日日操 | 国产视频一区二区三区在线 | 精品在线观看一区二区 | 国产香蕉av | 国产欧美综合在线观看 | 丁香五婷 | 国产成人l区 | 综合精品在线 | 91麻豆产精品久久久久久 | 国产xx视频 | 丁香婷婷激情网 | 91超级碰| 美女中文字幕 | 国产永久免费观看 | 久久99精品国产91久久来源 | 日韩黄色免费看 | 日韩一级片网址 | 99久久99久久综合 | 天天干婷婷 | 国产精品久久久久久久久大全 | 视频成人永久免费视频 | 国内成人精品2018免费看 | 久久黄色影视 | 2019中文最近的2019中文在线 | 三级av网 | 免费男女网站 | 国产成人精品av久久 | 欧美一区二区三区特黄 | 久久在视频 | 国产精品美女久久 | 人人澡人人爽欧一区 | 国产香蕉久久精品综合网 | 国产精品久久久久久久久久久不卡 | 波多野结衣日韩 | 成人91在线 | 中文字幕在线高清 | 国产亚洲在线观看 | av在线免费不卡 | 91免费观看 | 久久国产亚洲精品 | 在线观看一区 | 四虎国产精品成人免费影视 | 中文字幕在线观看第三页 | 97人人澡人人添人人爽超碰 | 天天操天天摸天天射 | 91精品导航 | 亚洲播播 | 中文字幕国内精品 | 精品一区二区三区久久 | 国产成人精品一区二区在线 | 精品一二区 | 久久国产精品久久久 | 中文字幕在线视频一区 | 成人影片在线免费观看 | 国产一级在线观看视频 | 香蕉国产91 | 黄色一级在线视频 | 91精品国产高清自在线观看 | 五月婷婷六月丁香在线观看 | 四虎影视成人精品国库在线观看 | 麻豆av电影 | 一区二区欧美在线观看 | 日韩网站在线免费观看 | 久久综合影视 | av电影免费在线看 | 色黄久久久久久 | 麻豆播放| 欧美日韩免费在线观看视频 | 久久av免费| 丁香五月亚洲综合在线 | 精品在线一区二区 | 91人人干 | 精品嫩模福利一区二区蜜臀 | av电影亚洲 | 97电影在线看视频 | av网站大全免费 | 国产成人一区二区三区在线观看 | 久久精品一 | 亚洲黄色激情小说 | 最新在线你懂的 | 国产精品视频在线看 | 日本久久久久 | 丁香av| 69视频在线播放 | 日本中文在线播放 | 久久视频在线视频 | 久久99国产视频 | 日韩毛片一区 | aaawww| 99久久久国产精品 | 久久久久亚洲精品成人网小说 | 一区二区三区韩国免费中文网站 | 中文字幕欲求不满 | 四虎www. | 在线亚洲欧美日韩 | 国产精品毛片久久蜜 | 免费网站观看www在线观看 | 国产精品免费久久久久久 | 亚洲精品www | 久久精品视频免费观看 | 亚洲成人av免费 | 青草视频在线 | 亚洲免费av在线播放 |