日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

【OpenGL】详解第一个OpenGL程序

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenGL】详解第一个OpenGL程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫在前面

?

OpenGL能做的事情太多了!很多程序也看起來(lái)很復(fù)雜。很多人感覺(jué)OpenGL晦澀難懂,原因大多是被OpenGL里面各種語(yǔ)句搞得頭大,一會(huì)gen一下,一會(huì)bind一下,一會(huì)又active一下。搞到最后都不知道自己在干嘛,更有可能因?yàn)槟骋徊降捻樞蝈e(cuò)誤導(dǎo)致最后渲染出錯(cuò),又或者覺(jué)得記下這些操作的順序是非常煩人的一件事。那么,OpenGL為什么會(huì)長(zhǎng)成這個(gè)樣子呢?這篇文章旨在通過(guò)一個(gè)最簡(jiǎn)單的OpenGL程序開(kāi)始,讓我們能夠“看懂”它,“記住”這些操作順序。

?

我們先來(lái)解釋一下OpenGL為什么會(huì)涉及這么多操作順序。這是因?yàn)?#xff0c;和我們現(xiàn)在使用的C++、C#這種面向?qū)ο蟮恼Z(yǔ)言不同,OpenGL中的大多數(shù)函數(shù)使用了一種基于狀態(tài)的方法,大多數(shù)OpenGL對(duì)象都需要在使用前把該對(duì)象綁定到context上。這里有兩個(gè)新名詞——OpenGL對(duì)象和Context。

?

Context

Context是一個(gè)非常抽象的概念,我們姑且把它理解成一個(gè)包含了所有OpenGL狀態(tài)的對(duì)象。如果我們把一個(gè)Context銷毀了,那么OpenGL也不復(fù)存在。

?

OpenGL對(duì)象

我們可以把OpenGL對(duì)象理解成一個(gè)狀態(tài)的集合,它負(fù)責(zé)管理它下屬的所有狀態(tài)。當(dāng)然,除了狀態(tài),OpenGL對(duì)象還會(huì)存儲(chǔ)其他數(shù)據(jù)。注意。這些狀態(tài)和上述context中的狀態(tài)并不重合,只有在把一個(gè)OpenGL對(duì)象綁定到context上時(shí),OpenGL對(duì)象的各種狀態(tài)才會(huì)映射到context的狀態(tài)。因此,這時(shí)如果我們改變了context的狀態(tài),那么也會(huì)影響這個(gè)對(duì)象,而相反地,依賴這些context狀態(tài)的函數(shù)也會(huì)使用存儲(chǔ)在這個(gè)對(duì)象上的數(shù)據(jù)。

?

因此,OpenGL對(duì)象的綁定既可能是為了修改該對(duì)象的狀態(tài)(大多數(shù)對(duì)象需要綁定到context上才可以改變它的狀態(tài)),也可能是為了讓context渲染時(shí)使用它的狀態(tài)。

?

畫了一個(gè)圖,僅供理解。圖中灰色的方塊代表各種狀態(tài),箭頭表示當(dāng)把一個(gè)OpenGL對(duì)象綁定到context上后,對(duì)應(yīng)狀態(tài)的映射。

?

前面提到過(guò),OpenGL就是一個(gè)“狀態(tài)機(jī)”。那些各種各樣的API調(diào)用會(huì)改變這些狀態(tài),或者根據(jù)這些狀態(tài)進(jìn)行操作。但我們要注意的是,這只是說(shuō)明了OpenGL是怎樣被定義的,但硬件是否是按狀態(tài)機(jī)實(shí)現(xiàn)的就是另一回事了。不過(guò),這不是我們需要擔(dān)心的地方。

?

OpenGL對(duì)象包含了下面一些類型:Buffer Objects,Vertex Array Objects,Textures,Framebuffer Objects等等。我們下面會(huì)講到Vertex Array Objects這個(gè)對(duì)象。

?

這些對(duì)象都有三個(gè)相關(guān)的重要函數(shù):

void glGen*(GLsizei n?, GLuint *objects?);

負(fù)責(zé)生成一個(gè)對(duì)象的name。而name就是這個(gè)對(duì)象的引用。

void glDelete*(GLsizei n?, const GLuint *objects?);

負(fù)責(zé)銷毀一個(gè)對(duì)象。

void glBind*(GLenum target?, GLuint object?);

將對(duì)象綁定到context上。

?

?

關(guān)于OpenGL對(duì)象還有很多內(nèi)容,這里就不講了。可以參見(jiàn)官方wiki。
?

?

?

在開(kāi)始第一個(gè)程序之前,我們還要了解一些圖形名詞。

?

  • 渲染(Rendering):計(jì)算機(jī)從模型到創(chuàng)建一張圖像的過(guò)程。OpenGL僅僅是其中一個(gè)渲染系統(tǒng)。它是一個(gè)基于光柵化的系統(tǒng),其他的系統(tǒng)還有光線追蹤(但有時(shí)也會(huì)用到OpenGL)等。
    ?
  • 模型(Models)或者對(duì)象(Objects):這里兩者的含義是一樣的。指從幾何圖元——點(diǎn)、線、三角形中創(chuàng)建的東西,由頂點(diǎn)指定。
    ?
  • Shaders:這是一類特殊的函數(shù),是在圖形硬件上執(zhí)行的。我們可以理解成,Shader是一些為圖形處理單元(GPU)編譯的小程序。OpenGL包含了編譯工具來(lái)把我們編寫的Shader源代碼編譯成可以在GPU上運(yùn)行的代碼。在OpenGL中,我們可以使用四種shader階段。最常見(jiàn)的就是vertex shaders——它們可以處理頂點(diǎn)數(shù)據(jù);以及fragment shaders,它們處理光柵化后生成的fragments。vertex shaders和fragment shaders是每個(gè)OpenGL程序必不可少的部分。
    ?
  • 像素(pixel):像素是我們顯示器上的最小可見(jiàn)元素。我們系統(tǒng)中的像素被存儲(chǔ)在一個(gè)幀緩存(framebuffer)中。幀緩存是一塊由圖形硬件管理的內(nèi)存空間,用于供給給我們的顯示設(shè)備。

?

?

驚鴻一瞥

?

?

我們的第一個(gè)程序(不完整)的運(yùn)行結(jié)果如下:

?

?

?

代碼如下(提示:這里可以粗略地看下中文注釋,后面會(huì)更詳細(xì)講述的):

/// // // triangles.cpp // /////-------------------------------------------------------------------- // // 在程序一開(kāi)頭,我們包含了所需的頭文件, // 聲明了一些全局變量(但通常是不用全局變量在做的,這里只是為了說(shuō)明一些基本問(wèn)題) // 以及其他一些有用的程序結(jié)構(gòu) //#include <iostream> using namespace std;#include "vgl.h" #include "LoadShaders.h"enum VAO_IDs { Triangles, NumVAOs }; enum Buffer_IDs { ArrayBuffer, NumBuffers }; enum Attrib_IDs { vPosition = 0 };GLuint VAOs[NumVAOs]; GLuint Buffers[NumBuffers];const GLuint NumVertices = 6;//--------------------------------------------------------------------- // // init // // init()函數(shù)用于設(shè)置我們后面會(huì)用到的一些數(shù)據(jù).例如頂點(diǎn)信息,紋理等 //void init(void) {glGenVertexArrays(NumVAOs, VAOs);glBindVertexArray(VAOs[Triangles]);// 我們首先指定了要渲染的兩個(gè)三角形的位置信息.GLfloat vertices[NumVertices][2] = {{ -0.90, -0.90 }, // Triangle 1{ 0.85, -0.90 },{ -0.90, 0.85 },{ 0.90, -0.85 }, // Triangle 2{ 0.90, 0.90 },{ -0.85, 0.90 }};glGenBuffers(NumBuffers, Buffers);glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),vertices, GL_STATIC_DRAW);// 然后使用了必需的vertex和fragment shadersShaderInfo shaders[] = {{ GL_VERTEX_SHADER, "triangles.vert" },{ GL_FRAGMENT_SHADER, "triangles.frag" },{ GL_NONE, NULL }};// LoadShaders()是我們自定義(這里沒(méi)有給出)的一個(gè)函數(shù),// 用于簡(jiǎn)化為GPU準(zhǔn)備shaders的過(guò)程,后面會(huì)詳細(xì)講述GLuint program = LoadShaders(shaders);glUseProgram(program);// 最后這部分我們成為shader plumbing,// 我們把需要的數(shù)據(jù)和shader程序中的變量關(guān)聯(lián)在一起,后面會(huì)詳細(xì)講述glVertexAttribPointer(vPosition, 2, GL_FLOAT,GL_FALSE, 0, BUFFER_OFFSET(0));glEnableVertexAttribArray(vPosition); }//--------------------------------------------------------------------- // // display // // 這個(gè)函數(shù)是真正進(jìn)行渲染的地方.它調(diào)用OpenGL的函數(shù)來(lái)請(qǐng)求數(shù)據(jù)進(jìn)行渲染. // 幾乎所有的display函數(shù)都會(huì)進(jìn)行下面的三個(gè)步驟. //void display(void) {// 1. 調(diào)用glClear()清空窗口glClear(GL_COLOR_BUFFER_BIT);// 2. 發(fā)起OpenGL調(diào)用來(lái)請(qǐng)求渲染你的對(duì)象glBindVertexArray(VAOs[Triangles]);glDrawArrays(GL_TRIANGLES, 0, NumVertices);// 3. 請(qǐng)求將圖像繪制到窗口glFlush(); }//--------------------------------------------------------------------- // // main // // main()函數(shù)用于創(chuàng)建窗口,調(diào)用init()函數(shù),最后進(jìn)入到事件循環(huán)(event loop). // 這里仍會(huì)看到一些以gl開(kāi)頭的函數(shù),但和上面的有所不同. // 這些函數(shù)來(lái)自第三方庫(kù),以便我們可以在不同的系統(tǒng)中更方便地使用OpenGL. // 這里我們使用的是GLUT和GLEW. //int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA);glutInitWindowSize(512, 512);glutInitContextVersion(4, 3);glutInitContextProfile(GLUT_CORE_PROFILE);glutCreateWindow(argv[0]);if (glewInit()) {cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE);}init();glutDisplayFunc(display);glutMainLoop(); }

Vertex Shader如下:

#version 430 core layout(location = 0) in vec4 vPosition; void main(){gl_Position = vPosition; }

Fragment Shader如下:

#version 430 core out vec4 fColor; void main() { fColor = vec4(0.0, 0.0, 1.0, 1.0); }

OpenGL的語(yǔ)法

?

這里插播一段語(yǔ)法解釋。從上面可以看出,OpenGL里面的函數(shù)長(zhǎng)得都有一個(gè)特點(diǎn),都是由“gl”開(kāi)頭的,然后緊跟一個(gè)或多個(gè)大寫字母(例如,glBindVertexArray())。而且可以告訴,所有的OpenGL函數(shù)都長(zhǎng)這樣。在上面的程序里面還有一些函數(shù)是“glut”開(kāi)頭的,這是來(lái)自O(shè)penGL實(shí)用工具(OpenGL Utility Toolkit)——GLUT。這是一個(gè)非常流行的跨平臺(tái)工具,可以用于打開(kāi)窗口、管理輸入等操作。龍書用的GLUT版本是Freeglut,是原始GLUT的一個(gè)變種。GLUT已經(jīng)不再更新了。。。Sad。。。同樣,還有一個(gè)函數(shù),glewInit(),它來(lái)自GLEW庫(kù)。GLUT和GLEW就是龍書所用的兩個(gè)庫(kù)了。

?

和OpenGL函數(shù)的命名規(guī)范類似,在display()函數(shù)里見(jiàn)到的GL_COLOR_BUFFER_BIT這樣的常量,也是OpenGL定義的。它們由GL_開(kāi)頭,實(shí)用下劃線來(lái)分割字符。它們的定義就是通過(guò)OpenGL頭文件(glcorearb.h和glewt.h)里面的#define指令定義的。

?

OpenGL為了跨平臺(tái)還自己定義了一系列數(shù)據(jù)類型,如GLfloat。而且,因?yàn)镺penGL是一個(gè)“C”語(yǔ)言庫(kù),它不使用函數(shù)重載來(lái)解決不同類型的數(shù)據(jù)問(wèn)題,而是使用函數(shù)命名規(guī)范來(lái)組織不同的函數(shù)。例如,后面我們會(huì)碰到一個(gè)函數(shù)叫g(shù)lUniform*(),這個(gè)函數(shù)有很多形式,例如,glUniform2f()和glUniform3fv。這些函數(shù)名字后面的后綴——2f和3fv,提供了函數(shù)的參數(shù)信息。例如,2f中的2表示有兩個(gè)數(shù)據(jù)將會(huì)傳遞給函數(shù),f表示這兩個(gè)參數(shù)的類型是GLfloat。而3fv中最后的v,則是vector的簡(jiǎn)寫,表明這三個(gè)GLfloat將以vector的形式傳遞給函數(shù),而不是三個(gè)獨(dú)立的參數(shù)。

?

一些例子中沒(méi)有使用OpenGL定義的數(shù)據(jù)類型,直接使用了float這樣的變量。這可能會(huì)造成在不同平臺(tái)上不兼容的問(wèn)題

?

?

?

在三維的世界里,所有的故事都是從頂點(diǎn)開(kāi)始的。雖然題目是“詳解第一個(gè)程序”,但目的是為了讓大家理解最基礎(chǔ)的頂點(diǎn)是怎么一步步傳遞到GLSL中的。

?

?

重點(diǎn)內(nèi)容開(kāi)始!

?

?

傳遞頂點(diǎn)數(shù)據(jù):你會(huì)怎么做

?

?

那么,現(xiàn)在的問(wèn)題是,如果是你,你會(huì)怎么把頂點(diǎn)和它相關(guān)的信息,例如紋理坐標(biāo)、法線等,傳遞給GLSL呢?一般人都會(huì)想到多維數(shù)組。我們下面把它稱為頂點(diǎn)流(Vertex Stream)。(什么?!你不是這么想的?!沒(méi)關(guān)系,OpenGL是這么想的就好。。。)

?

我們負(fù)責(zé)創(chuàng)建這個(gè)頂點(diǎn)流,然后只需要告訴OpenGL怎樣解讀它就可以了。

?

為了渲染一個(gè)對(duì)象,我們必須使用一個(gè)shader program。而這個(gè)program會(huì)定義一系列頂點(diǎn)屬性,例如上述Vertex Shader中的vPosition一行。這些屬性決定了我們需要傳遞哪些頂點(diǎn)數(shù)據(jù)。每一個(gè)屬性對(duì)應(yīng)了一個(gè)數(shù)組,并且這些數(shù)據(jù)的維度都必須相等,即是一一對(duì)應(yīng)的關(guān)系。

?

比如我們想要渲染3個(gè)頂點(diǎn),我們會(huì)定義下面的數(shù)據(jù):

{ {1, 1, 1}, {0, 0, 0}, {0, 0, 1} }

?

這些頂點(diǎn)的順序是非常重要的,OpenGL將會(huì)根據(jù)這些順序渲染網(wǎng)格。我們可以直接使用上述這種數(shù)據(jù)來(lái)直接渲染,也可以使用索引(indices)來(lái)指定順序,這樣可以重復(fù)使用同一個(gè)頂點(diǎn)。

?

例如,我們使用下面的索引列表:

{2, 1, 0, 2, 1, 2}


那么OpenGL將會(huì)渲染6個(gè)頂點(diǎn):

{ {0, 0, 1}, {0, 0, 0}, {1, 1, 1}, {0, 0, 1}, {0, 0, 0}, {0, 0, 1} }

?

?

現(xiàn)在,我們還想傳遞一個(gè)新的頂點(diǎn)屬性,即每個(gè)頂點(diǎn)的紋理坐標(biāo),那么新的紋理數(shù)組可能長(zhǎng)這樣:

{ {0, 0}, {0.5, 0}, {0, 1} }


注意,紋理數(shù)據(jù)的維度大小一定要和上面的坐標(biāo)數(shù)組大小一致,而其他頂點(diǎn)屬性數(shù)組的維度也要滿足這個(gè)條件。這是非常容易理解的。

?

那么,合并后的頂點(diǎn)屬性列表就是:

[{0, 0, 1}, {0, 1}], [{0, 0, 0}, {0.5, 0}], [{1, 1, 1}, {0, 0}], [{0, 0, 1}, {0, 1}], [{0, 0, 0}, {0.5, 0}], [{0, 0, 1}, {0, 1}] }

OpenGL的做法:VAO和VBO

?

?

OpenGL使用了VAO來(lái)實(shí)現(xiàn)上述管理頂點(diǎn)數(shù)據(jù)的數(shù)據(jù)作用,以及VBO來(lái)存放真正的頂點(diǎn)屬性數(shù)據(jù)。

?

VAO(Vertex Array Object)

?

?

我們這里遇到了第一種OpenGL對(duì)象——VAO(Vertex Array Object)。前面說(shuō)到OpenGL對(duì)象是狀態(tài)的集合,那么VAO就是所有頂點(diǎn)數(shù)據(jù)的狀態(tài)集合。它存儲(chǔ)了頂點(diǎn)數(shù)據(jù)的格式以及頂點(diǎn)數(shù)據(jù)數(shù)據(jù)所需的緩存對(duì)象的引用。前面提過(guò),OpenGL對(duì)象都有三個(gè)非常重要的函數(shù),而VAO對(duì)應(yīng)的就是glGenVertexArrays?、glDeleteVertexArrays和glBindVertexArray?。

?

VAO負(fù)責(zé)管理頂點(diǎn)屬性,而這些頂點(diǎn)屬性從0到GL_MAX_VERTEX_ATTRIBS??- 1被編號(hào)。這些屬性在Vertex Shader里的表現(xiàn)就是類似下面的語(yǔ)句:

layout(location = 0) in vec4 vPosition;

上述頂點(diǎn)屬性vPosition被編號(hào)為0。

?

每個(gè)屬性可以被enable或者disable,被disable的屬性是不會(huì)傳遞給shader的,即便在shader里定義了這些屬性,它們讀出的值也會(huì)是一個(gè)常量,而非真正的數(shù)據(jù)。一個(gè)新建的VAO的所有屬性訪問(wèn)都是disable的。而開(kāi)啟一個(gè)屬性是通過(guò)下面的函數(shù):

void glEnableVertexAttribArray?(GLuint index?);

與其對(duì)應(yīng)的是glDisableVertexAttribArray??函數(shù)。

?

而為了使用上述函數(shù)來(lái)改變VAO的狀態(tài),我們首先需要把VAO綁定到當(dāng)前的context上。

?

?

?

VBO(Vertex Buffer Object)

?

?

VBO是一種Buffer Object,即它也是一個(gè)OpenGl對(duì)象。VBO是頂點(diǎn)數(shù)組數(shù)據(jù)真正所在的地方。

?

為了指定一個(gè)屬性數(shù)據(jù)的格式和來(lái)源,我們需要告訴OpenGL,編號(hào)為0的屬性使用哪個(gè)VBO,編號(hào)為1的屬性使用哪個(gè)VBO等等。為了實(shí)現(xiàn)它,我們可以這么做。

?

首先,我們要知道,任何VBO都需要先綁定到GL_ARRAY_BUFFER?才可以對(duì)它進(jìn)行操作。綁定后,我們可以調(diào)用下面的函數(shù)之一:

void glVertexAttribPointer?( GLuint index?, GLint size?, GLenum type?,GLboolean normalized?, GLsizei stride?, const void *offset?);void glVertexAttribIPointer?( GLuint index?, GLint size?, GLenum type?,GLsizei stride?, const void *offset? );void glVertexAttribLPointer?( GLuint index?, GLint size?, GLenum type?,GLsizei stride?, const void *offset? );

它們的作用大同小異,就是告訴OpenGl,編號(hào)為index的屬性使用當(dāng)前綁定在GL_ARRAY_BUFFER?的VBO。為了更好理解,我們舉例:

glBindBuffer(GL_ARRAY_BUFFER, buf1); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);

上面第一行代碼將buf1綁定到了GL_ARRAY_BUFFER?上。第二行意味著,編號(hào)為0的屬性將使用buf1的數(shù)據(jù),因?yàn)楫?dāng)前綁定到GL_ARRAY_BUFFER?上的是buf1。第三行將緩存對(duì)象0綁定到了GL_ARRAY_BUFFER?上,這不會(huì)對(duì)頂點(diǎn)屬性有任何影響,只有g(shù)lVertexAttribPointer?函數(shù)可以影響它們!

?

這個(gè)過(guò)程就像一個(gè)中介人的作用,而中介人就是GL_ARRAY_BUFFER?。我們可以這么想,glBindBuffer??設(shè)置了一個(gè)全局變量,然后glVertexAttribPointer讀取了這個(gè)全局變量并把它存儲(chǔ)在VAO中,這個(gè)全局變量就是GL_ARRAY_BUFFER。當(dāng)調(diào)用完glVertexAttribPointer后,頂點(diǎn)屬性已經(jīng)知道了數(shù)據(jù)來(lái)源就是buf1,它們之間就會(huì)直接聯(lián)系,而不需要在通過(guò)GL_ARRAY_BUFFER。

總結(jié)

以上是生活随笔為你收集整理的【OpenGL】详解第一个OpenGL程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 亚洲av综合色区无码另类小说 | 亚洲一区成人在线 | 亚洲天堂一二三 | 日日夜夜狠狠 | 在线观看亚洲色图 | 美女视屏 | 一级a性色生活片久久无 | av女优天堂在线观看 | 国产欧美一区二区三区国产幕精品 | 国产成人77亚洲精品www | 中文字幕观看在线 | 黄色片子看看 | 久久白浆| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 四虎免费看黄 | 中文字幕一区二区三区在线不卡 | av网站网址| 国产又黄又大又爽 | 日本一区二区在线播放 | 九九综合久久 | 欧美美女色图 | 天天天色综合 | 999久久久国产精品 韩国精品一区二区 | 女女h百合无遮涩涩漫画软件 | 中文字幕黑人 | 亚洲黄色网络 | 大肉大捧一进一出好爽视频动漫 | 日韩成人精品在线观看 | 99国产精品国产精品九九 | 美女被猛网站 | 国内精品久久99人妻无码 | 美女又爽又黄视频 | 在线观看视频亚洲 | 丝袜av电影 | www.亚洲视频 | 国产欧美一区二区三区四区 | 国内视频一区二区三区 | 日本大尺度吃奶做爰久久久绯色 | 免费观看污网站 | 中文字幕日韩一级 | 午夜日韩视频 | 欧美亚洲精品一区二区 | 久操社区 | 狠狠干在线 | 欧美老熟 | 噜噜噜色 | 国产精品主播一区二区 | 成年人视频免费在线观看 | 一区二区视频在线免费观看 | 久久精品99国产精品日本 | 一区二区三区免费在线 | 欧美日韩一区二区区别是什么 | 国产免费大片 | 中日韩精品一区二区三区 | 国产精品免费视频观看 | 91pron在线 | 神马影院一区二区三区 | 色屁屁一区二区三区 | 成人91| 欧美性猛交xx | 成年人黄色小视频 | xzjzjzjzjzj欧美大片| 国产免费www | av性天堂网| 中文字幕av高清片 | 欧美级毛片 | 亚洲伊人天堂 | 一级做a爱片久久 | 日韩一级色片 | 草草影院ccyycom | 免费观看成人在线视频 | 黄色片视频免费 | 日韩亚洲第一页 | 欧美人xxx| 2019日韩中文字幕 | 欧美精品高清 | 亚洲社区在线 | 久久中文视频 | 精品国偷自产国产一区 | 国精产品一区二区 | 中文字幕免费av | 四虎国产视频 | 国产精品VideoSex性欧美 | 久久精品a亚洲国产v高清不卡 | 精品黄色一级片 | 国产又粗又猛又爽视频 | 日韩一级二级三级 | 青娱乐在线视频免费观看 | 六月丁香综合网 | wwwxxx在线播放 | 亚洲性一区 | 国产草草影院 | 欧美黄色免费网站 | 国产精品自偷自拍 | 国产精品国产三级国产aⅴ中文 | 精品久久久久久久久久久久久久久久 | 久久妇女 | 欧美一区二区免费视频 | 男人透女人免费视频 |