青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OpenGL Texture Mapping

學(xué)習(xí)紋理貼圖是十分有用的。 假如我們想使一個導(dǎo)彈飛過屏幕,  用前面的知識我們大概只能用多邊形來構(gòu)造。 而使用紋理映射, 我們完全可以讓一個真實的導(dǎo)彈圖片飛過屏幕。 一張照片和一個用多邊形構(gòu)造的物體, 你認為哪一個會更好呢?  使用紋理貼圖, 不僅能得到更好的視覺效果, 而且還能得到更好的運行效率。 因為使用紋理貼圖制作的導(dǎo)彈可以僅僅是一個四邊形, 而如果我們完全使用多邊形來構(gòu)造的話, 就有可能需要成百上千的多邊形了。 所以使用紋理映射的四邊形將為我們節(jié)省大量的運算。

 

我們以第一篇教程的代碼作為基礎(chǔ), 首先在開始處增加5行新的代碼。 第一行新代碼是 #include <stdio.h>, 因為我們之后要使用fopen()。 還有三行新代碼是增加了三個浮點變量: xrot, yrot zrot, 它們分別用于控制立方體在x,yz軸上的旋轉(zhuǎn)。 最后一行新代碼是 GLuint texture[1], 用于存儲一個紋理對象(譯注:紋理對象是一個非零的無符號整數(shù))。 如果有更多的紋理對象要保存, 就需要修改數(shù)組元素的數(shù)目為相應(yīng)的紋理對象的數(shù)目。

 

 

#include <windows.h>                                                 // Header File For Windows

#include <stdio.h>                                                // Header File For Standard Input/Output ( NEW )

#include <gl\gl.h>                                                 // Header File For The OpenGL32 Library

#include <gl\glu.h>                                               // Header File For The GLu32 Library

#include <gl\glaux.h>                                           // Header File For The GLaux Library

 

HDC              hDC=NULL;                                             // Private GDI Device Context

HGLRC           hRC=NULL;                                      // Permanent Rendering Context

HWND           hWnd=NULL;                                          // Holds Our Window Handle

HINSTANCE   hInstance;                                       // Holds The Instance Of The Application

 

bool              keys[256];                                              // Array Used For The Keyboard Routine

bool              active=TRUE;                                                 // Window Active Flag

bool              fullscreen=TRUE;                                     // Fullscreen Flag

 

GLfloat          xrot;                                                        // X Rotation ( NEW )

GLfloat          yrot;                                                        // Y Rotation ( NEW )

GLfloat          zrot;                                                        // Z Rotation ( NEW )

 

GLuint           texture[1];                                              // Storage For One Texture ( NEW )

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);              // Declaration For WndProc

 

 

下面我們增加了一段新的代碼, 其作用是讀入位圖文件。 如果文件不存在的話, 將返回NULL值代表文件不能被讀取。 在我解釋代碼之前, 還要講一些關(guān)于紋理圖像的很重要的事情: 紋理圖像的寬度和高度必須是2的冪。 寬度或高度最小應(yīng)是64個像素, 為了兼容性,最多應(yīng)是256個像素。 如果圖像的寬度或高度不是64128256個像素, 就應(yīng)該重新調(diào)整圖像尺寸, 這是解決這一限制的方法。 但現(xiàn)在我們只使用標準的紋理尺寸。

(譯注: 紋理的最小尺寸限制和最大尺寸限制其實取決于具體的OpenGL實現(xiàn))

 

 

首先我們創(chuàng)建一個文件句柄, 并初始化為 NULL。

 

AUX_RGBImageRec *LoadBMP(char *Filename)                                // Loads A Bitmap Image

{

       FILE *File=NULL;                                            // File Handle

 

 

接下來我們檢測文件名是否合法, 因為使用LoadBMP() 的用戶有可能根本沒有給出文件名。

 

       if (!Filename)                                                  // Make Sure A Filename Was Given

       {

              return NULL;                                           // If Not Return NULL

       }

 

然后, 試著打開文件, 以檢測文件是否存在。

 

       File=fopen(Filename,"r");                                      // Check To See If The File Exists

 

 

如果文件能打開證明其一定存在。 我們關(guān)閉文件, 然后返回 auxDIBImageLoad(Filename) 讀入的圖像數(shù)據(jù)。

 

       if (File)                                                            // Does The File Exist?

       {

              fclose(File);                                             // Close The Handle

              return auxDIBImageLoad(Filename);                           // Load The Bitmap And Return A Pointer

       }

 

 

如果不能打開文件, 我們返回 NULL。 之后在程序中我們要檢測文件是否讀取了, 如果沒有的話, 我們將退出程序并給出一個錯誤消息。

 

       return NULL;                                                  // If Load Failed Return NULL

}

 

 

下面這段代碼的作用是讀取位圖 (通過調(diào)用上面的代碼) 并轉(zhuǎn)換成紋理。

 

int LoadGLTextures()                                             // Load Bitmaps And Convert To Textures

{

 

 

我們設(shè)置一個 Status 變量, 它用于記錄我們是否成功地讀取了位圖并建造了紋理。 我們將其初始化為FLASE (代表什么都沒有讀取和建造)

 

       int Status=FALSE;                                                 // Status Indicator

 

 

現(xiàn)在我們創(chuàng)建一個用于保存位圖的圖像記錄, 它將持有圖像的寬度, 高度和數(shù)據(jù)。

 

       AUX_RGBImageRec *TextureImage[1];                               // Create Storage Space For The Texture

 

首先清空圖像記錄。

 

       memset(TextureImage,0,sizeof(void *)*1);                        // Set The Pointer To NULL

 

 

現(xiàn)在我們讀入位圖。 TextureImage[0]=LoadBMP("Data/NeHe.bmp") 將調(diào)用上面的LoadBMP() 讀入 Data 目錄中的 NeHe.bmp。 如果順利, 圖像數(shù)據(jù)會保存在TextureImage[0] 中, Status 被設(shè)置為 TRUE 然后我們開始建造紋理。

 

       // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit

       if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))

       {

              Status=TRUE;                                                // Set The Status To TRUE

 

 

現(xiàn)在我們已經(jīng)把圖像數(shù)據(jù)讀入了 TextureImage[0] 我們將用這個數(shù)據(jù)來建造紋理。 下面的第一行代碼glGenTextures(1, &texture[0]) 用于獲得一個未使用的紋理名稱。

第二行代碼glBindTexture(GL_TEXTURE_2D, texture[0]) 綁定一個紋理名稱到一個紋理對象。

(譯注:glBindTexture 即創(chuàng)建紋理對象, 又綁定紋理對象, 又使用紋理對象。 詳細內(nèi)容請看OpenGL紅皮書)

 

 

              glGenTextures(1, &texture[0]);                             // Create The Texture

 

              // Typical Texture Generation Using Data From The Bitmap

              glBindTexture(GL_TEXTURE_2D, texture[0]);

 

 

現(xiàn)在我們建造實際的紋理(譯注:這一步是指定紋理數(shù)據(jù))。 下面這行代碼告知OpenGL 我們將定義一個2D紋理。 0代表圖像的詳細級別, 這通常為0 (譯注:這與多紋理貼圖有關(guān))。 3 指定數(shù)據(jù)成分, 因為我們的圖像是紅,綠,藍組成的, 所以為3 TextureImage[0]->sizeX 是紋理寬度, 如果你知道具體的寬度數(shù)值, 可以直接寫在這兒, 不過我們這樣做更簡單。 TextureImage[0]->sizeY 是紋理高度。 0 是紋理邊界, 通常為 0。 GL_RGB 告知 OpenGL 我們的圖像數(shù)據(jù)是紅,綠,藍順序存儲的。GL_UNSIGNED_BYTE 表示圖像的數(shù)據(jù)類型是8位無符號整數(shù)。 最后TextureImage[0]->data 指定紋理數(shù)據(jù), 在這里指向TextureImage[0] 中保存的數(shù)據(jù)。

(譯注:詳細內(nèi)容請看OpenGL紅皮書)

 

 

              // Generate The Texture

              glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

 

 

下面兩行代碼分別用于設(shè)置在放大 (GL_TEXTURE_MAG_FILTER) 和縮小 (GL_TEXTURE_MIN_FILTER) 紋理貼圖的時候所使用的過濾。 我通常將它們都設(shè)置為GL_LINEAR, 這使紋理貼圖在距離屏幕很遠和很近的時候都能看起來很平滑。 當(dāng)然, 使用 GL_LINEAR 是要犧牲一些效率的, 所以如果你的系統(tǒng)較慢, 你可以使用 GL_NEAREST 不過使用 GL_NEAREST 可能會出現(xiàn)一些鋸齒。 當(dāng)然你可以把它們結(jié)合起來使用, 放大用一種, 縮小用一種。

 

              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);// Linear Filtering

              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);// Linear Filtering

       }

 

 

現(xiàn)在我們釋放掉存儲位圖數(shù)據(jù)的所有內(nèi)存。 首先檢查是否有位圖保存在TextureImage[0] 有的話檢查是否有數(shù)據(jù), 有即釋放掉, 最后釋放掉圖像結(jié)構(gòu), 確保所有內(nèi)存都釋放干凈了。

 

       if (TextureImage[0])                                              // If Texture Exists

       {

              if (TextureImage[0]->data)                                   // If Texture Image Exists

              {

                     free(TextureImage[0]->data);                       // Free The Texture Image Memory

              }

 

              free(TextureImage[0]);                                         // Free The Image Structure

       }

 

 

最后返回狀態(tài)。 如果一切順利, 變量Status 將為 TRUE 否則為 FALSE

 

       return Status;                                                       // Return The Status

}

 

 

InitGL中我添加了幾行新的代碼。 第一行 if (!LoadGLTextures()) 調(diào)用上面的代碼, 讀取位圖并建造紋理。 如果由于一些原因LoadGLTextures() 失敗了, 那么下面一行代碼將返回 FALSE。 如果讀入紋理成功, 那么我們就啟用(激活)紋理映射。 如果你忘記了啟用紋理映射, 物體看起來將是白色的。

 

int InitGL(GLvoid)                                                  // All Setup For OpenGL Goes Here

{

       if (!LoadGLTextures())                                           // Jump To Texture Loading Routine ( NEW )

       {

              return FALSE;                                                 // If Texture Didn't Load Return FALSE ( NEW )

       }

 

       glEnable(GL_TEXTURE_2D);                                         // Enable Texture Mapping ( NEW )

       glShadeModel(GL_SMOOTH);                                       // Enable Smooth Shading

       glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                                // Black Background

       glClearDepth(1.0f);                                               // Depth Buffer Setup

       glEnable(GL_DEPTH_TEST);                                         // Enables Depth Testing

       glDepthFunc(GL_LEQUAL);                                           // The Type Of Depth Testing To Do

       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);                     // Really Nice Perspective Calculations

       return TRUE;                                                  // Initialization Went OK

}

 

 

現(xiàn)在我們繪制貼圖立方體。 頭兩行代碼都是原來的代碼, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 用于清除屏幕為指定顏色和清除深度緩沖區(qū), 在這個例子中屏幕將被清除為黑色。 glLoadIdentity() 重置視圖(譯注:模型視圖矩陣)。

 

int DrawGLScene(GLvoid)                                                    // Here's Where We Do All The Drawing

{

       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);                   // Clear Screen And Depth Buffer

       glLoadIdentity();                                            // Reset The Current Matrix

       glTranslatef(0.0f,0.0f,-5.0f);                           // Move Into The Screen 5 Units

 

 

接下來的3行代碼用于在x,yz軸上旋轉(zhuǎn)立方體, 旋轉(zhuǎn)的角度有分別由變量xrotyrot zrot 控制。

 

       glRotatef(xrot,1.0f,0.0f,0.0f);                                       // Rotate On The X Axis

       glRotatef(yrot,0.0f,1.0f,0.0f);                                       // Rotate On The Y Axis

       glRotatef(zrot,0.0f,0.0f,1.0f);                                       // Rotate On The Z Axis

 

 

下面一行代碼用于選擇我們要使用的紋理。 如果想變換紋理, 就需要綁定另一個紋理。 有一點很重要, 那就是綁定紋理操作不能在glBegin() glEnd() 之間進行。 請注意我們是如何使用glBindTextures 來創(chuàng)建和選擇一個指定的紋理的。

 

       glBindTexture(GL_TEXTURE_2D, texture[0]);                      // Select Our Texture

 

 

想要適當(dāng)?shù)赜成湟粋€紋理(貼圖)到一個四邊形上, 你必須確保它們的右上角,左上角,右下角和左下角都能正確地一一對應(yīng), 否則紋理有可能被倒置過來, 也有可能歪斜了, 或者根本沒貼上。

 

glTexCoord2f 的第一個參數(shù)是x坐標(譯注:紋理坐標。為了與物體坐標相區(qū)分,紋理坐標一般使用字母st代替xy), 0.0f 就是紋理的左邊, 0.5f 就是紋理的中間, 1.0f 就是紋理的右邊。glTexCoord2f 的第二個參數(shù)是y坐標(譯注:紋理坐標) 0.0f 就是紋理的底邊, 0.5f 是中間, 1.0f 就是紋理的頂邊(最上邊)。

(譯注:紋理坐標范圍是01,詳細請看紅皮書)

 

現(xiàn)在我們知道, 紋理左上角的坐標是0.0f, 1.0f, 而四邊形左上角的頂點坐標是 -1.0f, 1.0f。 然后我們要做的就是匹配四邊形剩下的3個角。

 

你可以試著修改glTexCoord2f 的參數(shù), 1.0f 改為 0.5f 只繪制紋理的左半部分(0.0f0.5f), 0.0f 改為 0.5f 只繪制它的右半部分(0.5f1.0f)。

 

       glBegin(GL_QUADS);

              // Front Face

              glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);      // Bottom Left Of The Texture and Quad

              glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);      // Bottom Right Of The Texture and Quad

              glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);      // Top Right Of The Texture and Quad

              glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);     // Top Left Of The Texture and Quad

              // Back Face

              glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);       // Bottom Right Of The Texture and Quad

              glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);      // Top Right Of The Texture and Quad

              glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);      // Top Left Of The Texture and Quad

              glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);       // Bottom Left Of The Texture and Quad

              // Top Face

              glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);      // Top Left Of The Texture and Quad

              glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);     // Bottom Left Of The Texture and Quad

              glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);      // Bottom Right Of The Texture and Quad

              glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);      // Top Right Of The Texture and Quad

              // Bottom Face

              glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);       // Top Right Of The Texture and Quad

              glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);       // Top Left Of The Texture and Quad

              glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);      // Bottom Left Of The Texture and Quad

              glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);      // Bottom Right Of The Texture and Quad

              // Right face

              glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);       // Bottom Right Of The Texture and Quad

              glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);      // Top Right Of The Texture and Quad

              glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);      // Top Left Of The Texture and Quad

              glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);      // Bottom Left Of The Texture and Quad

              // Left Face

              glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);       // Bottom Left Of The Texture and Quad

              glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);      // Bottom Right Of The Texture and Quad

              glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);     // Top Right Of The Texture and Quad

              glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);      // Top Left Of The Texture and Quad

       glEnd();

 

 

現(xiàn)在我們給xrot,yrot zrot 增量。 你可以試著修改這些增量值, 讓立方體旋轉(zhuǎn)的更快或者更慢。 或者, +改為-,讓其向反方向旋轉(zhuǎn)。

 

       xrot+=0.3f;                                                    // X Axis Rotation

       yrot+=0.2f;                                                    // Y Axis Rotation

       zrot+=0.4f;                                                    // Z Axis Rotation

       return true;                                                    // Keep Going

}

 

 

你應(yīng)該已經(jīng)較好地理解了紋理映射, 可以給自己的四邊形貼圖了。 如果你對2D紋理映射感覺有了信心, 你可以試著給立方體的6個面映射不同的紋理貼圖。

 

如果你理解了紋理坐標, 那么紋理映射是不難理解的。 如果此篇教程的某些地方你不明白, 告訴我, 我會重寫那一部分教程,或者,在email里給你答復(fù)。 祝你貼圖愉快:)

 

Jeff Molofee (NeHe)

 

 

(譯著) 作者在紋理坐標這個關(guān)鍵的地方并沒有做多少敘述,但是由于這是非常基礎(chǔ)的,所以并無大礙。 如果你發(fā)現(xiàn)了什么問題或者疏漏, 請即時反饋給我, 這樣我就能做出相應(yīng)的補救或者更正。 十分歡迎你的支持和鼓勵, 那將會使我更有動力。

posted on 2006-01-19 23:52 zmj 閱讀(5111) 評論(1)  編輯 收藏 引用

評論

# re: OpenGL Texture Mapping 2011-05-08 17:46 丙丁丙丁

六個面貼六個圖的詳細的程序可以再寫一下嗎?  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜精品网| 欧美在线三级| 欧美日韩精品二区第二页| 久久亚洲影院| 久久国产高清| 久久三级视频| 免费欧美日韩| 欧美日韩系列| 国产精品区一区| 狠狠色伊人亚洲综合网站色 | 欧美日本韩国在线| 欧美h视频在线| 欧美日韩视频专区在线播放 | 中文av字幕一区| 亚洲天堂成人在线观看| 欧美在线free| 亚洲第一黄色| 欧美激情一区二区三级高清视频| 欧美国产日韩一区二区三区| 亚洲高清一区二区三区| 日韩视频在线观看国产| 亚洲先锋成人| 久久天天躁狠狠躁夜夜av| 欧美sm视频| 国产精品一香蕉国产线看观看| 永久久久久久| 亚洲欧美日韩一区在线| 欧美大片一区二区三区| 亚洲午夜精品视频| 久久综合狠狠综合久久综合88| 欧美国产亚洲视频| 国产欧美在线| 中文日韩欧美| 免费观看一级特黄欧美大片| 一个人看的www久久| 久久久精品2019中文字幕神马| 欧美日韩国产成人精品| 国产亚洲欧美色| 一区二区电影免费在线观看| 久久久国产成人精品| aa成人免费视频| 免费成人在线视频网站| 国产日韩欧美在线视频观看| 日韩亚洲欧美成人一区| 美女久久一区| 亚洲欧美在线播放| 欧美视频一区二| 日韩网站在线| 欧美高清视频在线| 久久国产精品久久久久久| 欧美日韩国语| 亚洲开发第一视频在线播放| 久久一区二区视频| 亚洲欧美国产高清va在线播| 蜜桃av一区二区| 午夜精品成人在线| 久久人人爽国产| 激情欧美日韩| 欧美激情一区二区三区在线视频观看| 一区二区三区欧美成人| 国产麻豆精品theporn| 久久精品视频一| 老司机一区二区三区| 中文精品视频| 久久久综合香蕉尹人综合网| 99re热这里只有精品免费视频| 亚洲视频一区二区免费在线观看| 国产精品区二区三区日本| 久久久久久九九九九| 欧美视频免费| 亚洲精品在线视频| 经典三级久久| 久久精品国产亚洲a| 亚洲免费一区二区| 欧美激情区在线播放| 欧美大秀在线观看| 亚洲国产精品t66y| 久久久久www| 久久久国产精品亚洲一区 | 久久伊人精品天天| 国产精品va在线播放| 亚洲国产精品va| 91久久久久久| 蜜臀a∨国产成人精品| 国产精品二区三区四区| 日韩视频一区二区三区在线播放免费观看 | 国产欧美精品日韩区二区麻豆天美| 亚洲国产视频a| 亚洲精品日韩综合观看成人91| 久久精品二区三区| 久久夜色精品国产亚洲aⅴ| 国产日韩在线视频| 欧美淫片网站| 亚洲人成亚洲人成在线观看图片| 伊人成人在线视频| 欧美激情aaaa| 欧美一区二区三区视频免费播放| 久久频这里精品99香蕉| 日韩视频免费大全中文字幕| 欧美日韩国产三级| 亚洲欧美在线x视频| 欧美成人一区二区三区片免费| 在线精品视频免费观看| 国产精品白丝av嫩草影院| 久久久精品日韩欧美| 亚洲视频成人| 99精品国产高清一区二区| 久久免费的精品国产v∧| 中文欧美在线视频| 亚洲高清视频的网址| 国产三级精品三级| 国产精品成人观看视频国产奇米| 久久久久久久综合狠狠综合| 亚洲人体一区| 亚洲精品日日夜夜| 亚洲国产成人在线| 久久免费视频一区| 久久中文精品| 国产欧美一区二区三区久久| 欧美日韩视频在线| 欧美日韩亚洲综合| 国产精品成人播放| 国产精品网站在线| 国产日韩精品久久| 精品福利电影| 亚洲国产成人在线播放| 亚洲成色777777在线观看影院| 国产欧美一区二区精品秋霞影院 | 欧美在线播放高清精品| 欧美一区二区三区四区在线观看地址| 亚洲视频第一页| 欧美一区二区在线免费观看| 久久精彩视频| 欧美日韩午夜视频在线观看| 国产精品久线观看视频| 国产主播一区二区三区四区| 亚洲电影免费观看高清| 这里只有精品视频在线| 久久精品国产第一区二区三区最新章节| 亚洲欧美一区二区精品久久久| 久久99在线观看| 亚洲人成网站色ww在线| 欧美专区日韩视频| 欧美日韩亚洲高清| 亚洲国产福利在线| 亚洲欧美综合网| 日韩一区二区精品视频| 久久综合狠狠综合久久激情| 国产精品毛片一区二区三区| 亚洲精品视频在线观看免费| 久久久久久久一区二区| 一本到高清视频免费精品| 久久综合久久美利坚合众国| 国产亚洲欧美日韩一区二区| 亚洲砖区区免费| 日韩亚洲欧美精品| 欧美日韩第一页| 亚洲开发第一视频在线播放| 亚洲欧美日韩视频一区| 久久久人成影片一区二区三区| 亚洲第一久久影院| 久久综合婷婷| 91久久精品久久国产性色也91| 久久亚洲精品欧美| 欧美一级专区| 亚洲电影成人| 亚洲精品女av网站| 免费久久99精品国产自| 亚洲美女在线视频| 99国产精品国产精品毛片| 欧美视频中文字幕在线| 欧美亚洲免费| 欧美专区在线观看| 亚洲电影免费观看高清完整版在线 | 欧美阿v一级看视频| 欧美美女日韩| 久久久久久电影| 国产精品igao视频网网址不卡日韩| 亚洲综合欧美| 欧美激情影音先锋| 久久人人爽爽爽人久久久| 欧美日韩国产在线看| 玖玖玖国产精品| 国产精品天美传媒入口| 亚洲国产日韩欧美在线图片| 国产精品日韩精品欧美在线| 欧美高清自拍一区| 国语自产精品视频在线看8查询8| 亚洲国产91色在线| 国内精品久久久久久久97牛牛| 亚洲免费电影在线| 亚洲精品日韩精品| 欧美成人黑人xx视频免费观看 | 国产欧美日韩综合一区在线播放| 久久裸体艺术| 在线免费观看欧美| 另类激情亚洲| 亚洲福利国产| 亚洲靠逼com| 欧美特黄a级高清免费大片a级|