精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenGL ES 2.0 編程三步曲

移動開發 移動應用
什么是OpenGL ES?OpenGL ES (為OpenGL for Embedded System的縮寫) 為適用于嵌入式系統的一個免費二維和三維圖形庫。為桌面版本OpenGL 的一個子集。OpenGL ES 定義了一個在移動平臺上能夠支持OpenGL最基本功能的精 ...

OpenGL 與 OpenGL ES的關系OpenGL ES 是基于桌面版本OpenGL 的:

OpenGL ES 1.0  基于OpenGL 1.3 , 在2003年發布

OpenGL ES 1.1   基于OpenGL 1.5 ,  在2004年發布

OpenGL ES 2.0  基于OpenGL2.0,   在2007年發布

OpenGL 2.0 向下兼容OpenGL 1.5   而 OpenGL ES 2.0 和OpenGL ES 1.x 不兼容,是兩種完全不同的實現。

1. 保存全局變量的數據結構

以下例子程序均基于Linux平臺。

[cpp]view plaincopy

  1. typedef struct _escontext   
  2. {   
  3.    void*       userData;                    // Put your user data here...   
  4.    GLint       width;                          // Window width   
  5.    GLint       height;                         // Window height   
  6.    EGLNativeWindowType  hWnd;  // Window handle   
  7.    EGLDisplay  eglDisplay;             // EGL display   
  8.    EGLContext  eglContext;            // EGL context   
  9.    EGLSurface  eglSurface;            // EGL surface   
  10.    // Callbacks   
  11.    void (ESCALLBACK *drawFunc) ( struct _escontext * );   
  12.    void (ESCALLBACK *keyFunc) ( struct _escontext *, unsigned charintint );   
  13.    void (ESCALLBACK *updateFunc) ( struct _escontext *, float deltaTime );   
  14. }ESContext;   

[cpp]view plaincopy

  1. typedef struct   
  2. {   
  3.    // Handle to a program object   
  4.    GLuint programObject;   
  5.    // Atrribute Location   
  6.    GLint positionLoc;   
  7.    GLint textureLoc;   
  8.    // Uniform location   
  9.    GLint matrixModeLoc;   
  10.    GLint matrixViewLoc;   
  11.    GLint matrixPerspectiveLoc;   
  12.    // Sampler location   
  13.    GLint samplerLoc;   
  14.    // texture   
  15.    GLuint texture;   
  16. } UserData;  

2. 初始化EGL渲染環境和相關元素(***步曲)

[cpp]view plaincopy

  1. int InitEGL(ESContext * esContext)   
  2. {   
  3.      NativeWindowType eglWindow = NULL;   
  4.      EGLDisplay display;   
  5.      EGLContext context;   
  6.      EGLSurface surface;   
  7.      EGLConfig configs[2];   
  8.      EGLBoolean eRetStatus;   
  9.      EGLint majorVer, minorVer;   
  10.      EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};   
  11.      EGLint numConfigs;   
  12.      EGLint cfg_attribs[] = {EGL_BUFFER_SIZE,    EGL_DONT_CARE,   
  13.                              EGL_DEPTH_SIZE,     16,   
  14.                              EGL_RED_SIZE,       5,   
  15.                              EGL_GREEN_SIZE,     6,   
  16.                              EGL_BLUE_SIZE,      5,   
  17.                              EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,   
  18.                              EGL_NONE};   
  19.      // Get default display connection    
  20.      display = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);   
  21.      if ( display == EGL_NO_DISPLAY )   
  22.      {   
  23.           return EGL_FALSE;   
  24.      }   
  25.      // Initialize EGL display connection   
  26.      eRetStatus = eglInitialize(display, &majorVer, &minorVer);   
  27.      if( eRetStatus != EGL_TRUE )   
  28.      {   
  29.           return EGL_FALSE;   
  30.      }   
  31.      //Get a list of all EGL frame buffer configurations for a display   
  32.      eRetStatus = eglGetConfigs (display, configs, 2, &numConfigs);   
  33.      if( eRetStatus != EGL_TRUE )   
  34.      {   
  35.           return EGL_FALSE;   
  36.      }   
  37.      // Get a list of EGL frame buffer configurations that match specified attributes   
  38.      eRetStatus = eglChooseConfig (display, cfg_attribs, configs, 2, &numConfigs);   
  39.      if( eRetStatus != EGL_TRUE  || !numConfigs)   
  40.      {   
  41.           return EGL_FALSE;   
  42.      }   
  43.      // Create a new EGL window surface   
  44.      surface = eglCreateWindowSurface(display, configs[0], eglWindow, NULL);   
  45.      if (surface == EGL_NO_SURFACE)   
  46.      {   
  47.           return EGL_FALSE;   
  48.      }   
  49.      // Set the current rendering API (EGL_OPENGL_API, EGL_OPENGL_ES_API,EGL_OPENVG_API)   
  50.      eRetStatus = eglBindAPI(EGL_OPENGL_ES_API);   
  51.      if (eRetStatus != EGL_TRUE)   
  52.      {   
  53.           return EGL_FALSE;   
  54.      }   
  55.      // Create a new EGL rendering context   
  56.      context = eglCreateContext (display, configs[0], EGL_NO_CONTEXT, context_attribs);   
  57.      if (context == EGL_NO_CONTEXT)   
  58.      {   
  59.           return EGL_FALSE;   
  60.      }   
  61.      // Attach an EGL rendering context to EGL surfaces   
  62.      eRetStatus = eglMakeCurrent (display, surface, surface, context);   
  63.      if( eRetStatus != EGL_TRUE )   
  64.      {   
  65.           return EGL_FALSE;   
  66.      }   
  67.      //If interval is set to a value of 0, buffer swaps are not synchronized to a video frame, and the swap happens as soon as the render is complete.   
  68.      eglSwapInterval(display,0);   
  69.      // Return the context elements   
  70.      esContext->eglDisplay = display;   
  71.      esContext->eglSurface = surface;   
  72.      esContext->eglContext = context;   
  73.      return EGL_TRUE;   
  74. }  

3. 生成Program (第二步曲)

3.1 LoadShader

LoadShader主要實現以下功能:

1) 創建Shader對象

2) 裝載Shader源碼

3) 編譯Shader

其實現參考代碼如下:

[cpp]view plaincopy

  1. /* type specifies the Shader type: GL_VERTEX_SHADER or GL_FRAGMENT_SHADER */   
  2. GLuint LoadShader ( GLenum type, const char *shaderSrc )   
  3. {   
  4.    GLuint shader;   
  5.    GLint compiled;   
  6.       
  7.    // Create an empty shader object, which maintain the source code strings that define a shader   
  8.    shader = glCreateShader ( type );   
  9.    if ( shader == 0 )   
  10.     return 0;   
  11.    // Replaces the source code in a shader object   
  12.    glShaderSource ( shader, 1, &shaderSrc, NULL );   
  13.       
  14.    // Compile the shader object   
  15.    glCompileShader ( shader );   
  16.    // Check the shader object compile status   
  17.    glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );   
  18.    if ( !compiled )    
  19.    {   
  20.       GLint infoLen = 0;   
  21.       glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );   
  22.          
  23.       if ( infoLen > 1 )   
  24.       {   
  25.          char* infoLog = malloc (sizeof(char) * infoLen );   
  26.          glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );   
  27.          esLogMessage ( "Error compiling shader:\n%s\n", infoLog );               
  28.             
  29.          free ( infoLog );   
  30.       }   
  31.       glDeleteShader ( shader );   
  32.       return 0;   
  33.    }   
  34.    return shader;   
  35. }   

1)glCreateShader

它創建一個空的shader對象,它用于維護用來定義shader的源碼字符串。支持以下兩種shader:

(1) GL_VERTEX_SHADER: 它運行在可編程的“頂點處理器”上,用于代替固定功能的頂點處理;

(2) GL_FRAGMENT_SHADER: 它運行在可編程的“片斷處理器”上,用于代替固定功能的片段處理;

2)glShaderSource

shader對象中原來的源碼全部被新的源碼所代替。

3)glCompileShader

編譯存儲在shader對象中的源碼字符串,編譯結果被當作shader對象狀態的一部分被保存起來,可通過glGetShaderiv函數獲取編譯狀態。

4)glGetShaderiv

獲取shader對象參數,參數包括:GL_SHADER_TYPE, GL_DELETE_STATUS, GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, GL_SHADER_SOURCE_LENGTH.

3.2 LoadProgram

其參考代碼如下:

[cpp]view plaincopy

  1. GLuint LoadProgram ( const char *vShaderStr, const char *fShaderStr )   
  2. {   
  3.    GLuint vertexShader;   
  4.    GLuint fragmentShader;   
  5.    GLuint programObject;   
  6.    GLint linked;   
  7.    // Load the vertex/fragment shaders   
  8.    vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr );   
  9.    fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr );   
  10.    // Create the program object   
  11.    programObject = glCreateProgram ( );   
  12.    if ( programObject == 0 )   
  13.       return 0;   
  14.    // Attaches a shader object to a program object   
  15.    glAttachShader ( programObject, vertexShader );   
  16.    glAttachShader ( programObject, fragmentShader );   
  17.    // Bind vPosition to attribute 0      
  18.    glBindAttribLocation ( programObject, 0, "vPosition" );   
  19.    // Link the program object   
  20.    glLinkProgram ( programObject );   
  21.    // Check the link status   
  22.    glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );   
  23.    if ( !linked )    
  24.    {   
  25.       GLint infoLen = 0;   
  26.       glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );   
  27.          
  28.       if ( infoLen > 1 )   
  29.       {   
  30.          char* infoLog = malloc (sizeof(char) * infoLen );   
  31.          glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );   
  32.          esLogMessage ( "Error linking program:\n%s\n", infoLog );               
  33.             
  34.          free ( infoLog );   
  35.       }   
  36.       glDeleteProgram ( programObject );   
  37.       return GL_FALSE;   
  38.    }   
  39.     
  40.    // Free no longer needed shader resources   
  41.    glDeleteShader ( vertexShader );   
  42.    glDeleteShader ( fragmentShader );   
  43.    return programObject;   
  44. }   

1)glCreateProgram

建立一個空的program對象,shader對象可以被連接到program對像

2)glAttachShader

program對象提供了把需要做的事連接在一起的機制。在一個program中,在shader對象被連接在一起之前,必須先把shader連接到program上。

3)glBindAttribLocation

把program的頂點屬性索引與頂點shader中的變量名進行綁定。

4)glLinkProgram

連接程序對象。如果任何類型為GL_VERTEX_SHADER的shader對象連接到program,它將產生在“可編程頂點處理器”上可執行的程 序;如果任何類型為GL_FRAGMENT_SHADER的shader對象連接到program,它將產生在“可編程片斷處理器”上可執行的程序。

5)glGetProgramiv

獲取program對象的參數值,參數有:GL_DELETE_STATUS, GL_LINK_STATUS, GL_VALIDATE_STATUS, GL_INFO_LOG_LENGTH, GL_ATTACHED_SHADERS, GL_ACTIVE_ATTRIBUTES, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, GL_ACTIVE_UNIFORMS, GL_ACTIVE_UNIFORM_MAX_LENGTH.

3.3 CreateProgram

在3.1中只實現了Shader的編譯,在3.2中只實現了Program的鏈接,現在還缺少真正供進行編譯和鏈接的源碼,其參考代碼如下:

[cpp]view plaincopy

  1. int CreateProgram(ESContext * esContext)   
  2. {   
  3.      GLuint programObject;   
  4.      GLbyte vShaderStr[] =     
  5.       "attribute vec4 vPosition;    \n"   
  6.       "void main()                  \n"   
  7.       "{                            \n"   
  8.       "   gl_Position = vPosition;  \n"   
  9.       "}                            \n";   
  10.       
  11.      GLbyte fShaderStr[] =     
  12.       "precision mediump float;\n"\   
  13.       "void main()                                  \n"   
  14.       "{                                            \n"   
  15.       "  gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n"   
  16.       "}                                                    \n";   
  17.        
  18.     // Create user data    
  19.     esContext->userData = malloc(sizeof(UserData));   
  20.     UserData *userData = esContext->userData;   
  21.     // Load the shaders and get a linked program object   
  22.     programObject = LoadProgram ( (const char*)vShaderStr, (const char*)fShaderStr );   
  23.     if(programObject == 0)   
  24.     {   
  25.     return GL_FALSE;   
  26.     }   
  27.     // Store the program object   
  28.     userData->programObject = programObject;   
  29.     // Get the attribute locations   
  30.     userData->positionLoc = glGetAttribLocation ( g_programObject, "v_position" );   
  31.     glClearColor ( 0.0f, 0.0f, 0.0f, 1.0f );   
  32.     return 0;   
  33. }   

4. 安裝并執行Program(第三步) 

[cpp]view plaincopy

  1. void Render ( ESContext *esContext )   
  2. {   
  3.    UserData *userData = esContext->userData;   
  4.    GLfloat vVertices[] = {  0.0f,  0.5f, 0.0f,    
  5.                            -0.5f, -0.5f, 0.0f,   
  6.                             0.5f, -0.5f, 0.0f };   
  7.          
  8.    // Set the viewport   
  9.    glViewport ( 0, 0, esContext->width, esContext->height );   
  10.       
  11.    // Clear the color buffer   
  12.    glClear ( GL_COLOR_BUFFER_BIT );   
  13.    // Use the program object   
  14.    glUseProgram ( userData->programObject );   
  15.    // Load the vertex data   
  16.    glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );   
  17.    glEnableVertexAttribArray ( 0 );   
  18.    glDrawArrays ( GL_TRIANGLES, 0, 3 );   
  19.    eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface);

[cpp]view plaincopy

4.1 glClear

清除指定的buffer到預設值。可清除以下四類buffer:

1)GL_COLOR_BUFFER_BIT

2)GL_DEPTH_BUFFER_BIT

3)GL_ACCUM_BUFFER_BIT

4)GL_STENCIL_BUFFER_BIT

預設值通過glClearColor, glClearIndex, glClearDepth, glClearStencil, 和glClearAccum來設置。

1)gClearColor

指定color buffer的清除值,當調用glClear(GL_COLOR_BUFFER_BIT)時才真正用設定的顏色值清除color buffer。參數值的范圍為:0~1。

  1. void glClearColor( GLclampf   red, GLclampf   green,  GLclampf   blue,  GLclampf   alpha); 

2)glClearIndex

       指定color index buffer清除值。void glClearIndex( GLfloat   c);

3)glClearDepth

       指定depth buffer的清除值,取值范圍為:0~1,默認值為1。

       void glClearDepth( GLclampd   depth);

4)glClearStencil

       指定stencil buffer清除值的索引,初始值為0。void glClearStencil( GLint   s);

5)glClearAccum

       指定accumulation buffer的清除值,初始值為0,取值范圍為:-1~1

      void glClearAccum( GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha);

4.2 glUseProgram

安裝一個program object,并把它作為當前rendering state的一部分。

1) 當一個可執行程序被安裝到vertex processor,下列OpenGL固定功能將被disable:

  • The modelview matrix is not applied to vertex coordinates.
  • The projection matrix is not applied to vertex coordinates.
  • The texture matrices are not applied to texture coordinates.
  • Normals are not transformed to eye coordinates.
  • Normals are not rescaled or normalized.
  • Normalization of GL_AUTO_NORMAL evaluated normals is not performed.
  • Texture coordinates are not generated automatically.
  • Per-vertex lighting is not performed.
  • Color material computations are not performed.
  • Color index lighting is not performed.
  • This list also applies when setting the current raster position.

2)當一個可執行程序被安裝到fragment processor,下列OpenGL固定功能將被disable:

  • Texture environment and texture functions are not applied.
  • Texture application is not applied.
  • Color sum is not applied.
  • Fog is not applied.

4.3 glVertexAttribPointer

定義一個通用頂點屬性數組。當渲染時,它指定了通用頂點屬性數組從索引index處開始的位置和數據格式。其定義如下:

[cpp]view plaincopy

  1. void glVertexAttribPointer(   
  2.       GLuint   index,           // 指示將被修改的通用頂點屬性的索引   
  3.        GLint   size,             // 指點每個頂點元素個數(1~4)   
  4.       GLenum   type,            // 數組中每個元素的數據類型   
  5.        GLboolean   normalized,   //指示定點數據值是否被歸一化(歸一化<[-1,1]或[0,1]>:GL_TRUE,直接使用:GL_FALSE)   
  6.       GLsizei   stride,         // 連續頂點屬性間的偏移量,如果為0,相鄰頂點屬性間緊緊相鄰   
  7.        const GLvoid *   pointer);//頂點數組   
  8. :其index應該小于#define GL_MAX_VERTEX_ATTRIBS               0x8869   

4.4glEnableVertexAttribArray

Enable由索引index指定的通用頂點屬性數組。

  1. void glEnableVertexAttribArray( GLuint   index); 
  2. void glDisableVertexAttribArray( GLuint   index);

默認狀態下,所有客戶端的能力被disabled,包括所有通用頂點屬性數組。如果被Enable,通用頂點屬性數組中的值將被訪問并被用于rendering,通過調用頂點數組命令:glDrawArrays, glDrawElements, glDrawRangeElements, glArrayElement, glMultiDrawElements, or glMultiDrawArrays.

4.5 glDrawArrays

 void glDrawArrays( GLenum   mode, 

                                  GLint   first, 

                                  GLsizei   count);

1) mode:指明render原語,如:GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, 和 GL_POLYGON。

2) first: 指明Enable數組中起始索引。

3) count: 指明被render的原語個數。

可以預先使用單獨的數據定義vertex、normal和color,然后通過一個簡單的glDrawArrays構造一系列原語。當調用 glDrawArrays時,它使用每個enable的數組中的count個連續的元素,來構造一系列幾何原語,從第first個元素開始。

4.6 eglSwapBuffers

把EGL surface中的color buffer提交到native window進行顯示。 

EGLBoolean eglSwapBuffers(EGLDisplay display,EGLSurface surface)

5. 協調組織

在前面的描述中,三步曲已經完成了:

1)初始化EGL環境,為繪圖做好準備

2)生成Program

3)安裝并執行Program

只有這三個關鍵人物,還不能運行,還需要一個協調組織者。其參考代碼如下:   

[cpp]view plaincopy

  1. int main(int argc, char** argv)   
  2. {   
  3.     ESContext esContext;   
  4.     UserData  userData;   
  5.     int iFrames;    
  6.     unsigned long iStartTime,iEndTime;   
  7.     int iDeltaTime;   
  8.     memset( &esContext, 0, sizeof( ESContext) );   
  9.     esContext.userData = &userData;   
  10.     esContext.width = 1280;   
  11.     esContext.height = 720;   
  12.     // Init EGL display, surface and context   
  13.     if(!InitEGL(&esContext))   
  14.     {   
  15.         printf("Init EGL fail\n");   
  16.         return GL_FALSE;   
  17.     }   
  18.     // compile shader, link program    
  19.     if(!CreateProgram(&esContext))   
  20.     {   
  21.         printf("Create Program fail\n");   
  22.         return GL_FALSE;   
  23.     }   
  24.     iStartTime = GetCurTime();   
  25.     iFrames = 0;   
  26.     while(1)   
  27.     {    // render a frame   
  28.          Render();   
  29.          iFrames++;   
  30.            
  31.          iEndTime = GetCurTime();   
  32.     iDeltaTime  = iEndTime - iStartTime;   
  33.     if(iDeltaTime >= 5000)   
  34.     {   
  35.             iStartTime = iEndTime;   
  36.         float fFrame = iFrames * 1000.0 / iDeltaTime;   
  37.         iFrames = 0;   
  38.         printf("Frame.: %f\n", fFrame);   
  39.     }   
  40.     }   
  41.     glDeleteProgram (esContext.userData->programObject);   
  42.     return GL_TRUE;   
  43. }  

http://www.51testing.com/html/88/377588-836167.html

責任編輯:閆佳明 來源: 51testing
相關推薦

2012-08-08 17:05:36

App運營

2011-04-11 16:37:21

2024-04-18 11:43:28

緩存數據庫Redis

2013-12-01 15:34:18

綠色數據中心數據中心

2010-05-17 09:49:19

DataCore虛擬化

2021-12-17 09:00:00

數據中心運營云計算

2009-02-04 09:45:05

Java SocketSocket APIJava編程

2020-07-27 10:00:18

遠程辦公網絡安全網絡攻擊

2014-08-05 14:49:39

Web響應式設計design

2009-01-20 10:42:00

局域網硬件故障排除

2009-07-09 19:19:11

SiteView運維管理游龍科技

2014-04-29 14:16:54

2014-04-24 11:16:00

OpenGL ES 2入門

2022-03-25 10:23:40

用戶體驗APP優化

2012-02-07 17:25:50

2021-03-02 07:02:45

Linux操作系統

2025-09-08 06:15:00

源碼編譯運維系統運維

2021-09-13 20:37:50

AI

2009-03-24 18:58:31

虛擬化通信

2014-04-29 14:27:59

OpenGL ES 2Android繪制紋理
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久久久直播 | 风间由美一二三区av片| 91www在线| 久久久噜噜噜久噜久久综合| 国产精品视频网站| 欧美日韩国产精品一区二区三区| 神马久久av| 欧美乱妇23p| 国产精品久久中文字幕| 91在线网址| av午夜精品一区二区三区| 国产精品免费电影| 国产又色又爽又黄的| 日韩一区二区在线| 亚洲精品国产免费| 亚洲女人在线观看| 日本精品网站| 五月综合激情网| 亚洲综合欧美日韩| 欧美男男激情freegay| 国产毛片精品一区| 国产精品扒开腿爽爽爽视频 | 喷水视频在线观看| 国内欧美日韩| 欧美色欧美亚洲高清在线视频| 黄色www在线观看| 你懂的免费在线观看视频网站| 韩国v欧美v日本v亚洲v| 国产极品jizzhd欧美| 91蜜桃视频在线观看| 亚洲一级淫片| 综合激情国产一区| 成人免费毛片糖心| 第一区第二区在线| 日韩一区二区三区视频在线观看| 天天影视综合色| 美女露胸视频在线观看| 亚洲一区二区三区爽爽爽爽爽| 一区二区三区久久网| 黄视频在线播放| hitomi一区二区三区精品| 亚洲va电影大全| 伊人成年综合网| 久久久久久色| 热99在线视频| 在线天堂中文字幕| 一区二区三区四区五区精品视频 | 欧美另类激情| 91福利小视频| 午夜dv内射一区二区| 中文在线免费二区三区| 欧美日韩精品国产| 六月丁香婷婷激情| 偷拍自拍在线看| 天天av天天翘天天综合网| 免费看欧美黑人毛片| 青春草视频在线| 亚洲一区二区三区小说| 国产女主播自拍| 狠狠操一区二区三区| 午夜电影一区二区三区| 免费观看美女裸体网站| 小视频免费在线观看| 日韩欧美亚洲范冰冰与中字| 免费观看精品视频| 欧美与亚洲与日本直播| 欧美日韩视频专区在线播放| 在线观看免费污视频| www.久久久.com| 欧美一区二区视频在线观看2020 | av在线网址导航| 国外成人福利视频| 欧美一级高清大全免费观看| 亚洲少妇一区二区三区| 女人抽搐喷水高潮国产精品| 亚洲精品在线不卡| 9.1片黄在线观看| 欧美在线91| 51精品在线观看| 国产乡下妇女三片| 国产精品亚洲а∨天堂免在线| av一本久道久久波多野结衣| 日韩一卡二卡在线| 中文字幕免费不卡在线| 永久免费看av| 男人的天堂免费在线视频| 欧美亚洲一区三区| 色哟哟免费视频| 性欧美lx╳lx╳| 日韩在线视频网| 精品无码久久久久久久| 久久精品盗摄| 91免费精品国偷自产在线| 三级视频在线看| 国产日本一区二区| 欧美在线观看黄| 日韩精品一区二区三区| 欧美一区二区在线免费播放| 黄色av网址在线观看| 日韩欧美字幕| 97在线视频免费观看| 少妇又紧又色又爽又刺激视频| 国产精品白丝jk黑袜喷水| 蜜桃999成人看片在线观看| 麻豆视频网站在线观看| 黄色一区二区三区| 女人高潮一级片| 香蕉久久精品| 欧美疯狂做受xxxx高潮| 天天射天天干天天| 高清国产午夜精品久久久久久| 品久久久久久久久久96高清| 女同一区二区免费aⅴ| 色婷婷精品久久二区二区蜜臂av| 久久久久亚洲av无码麻豆| 狠狠做深爱婷婷综合一区| 久久久久久97| ,亚洲人成毛片在线播放| 91亚洲国产成人精品一区二区三| 成人午夜免费剧场| 国产精品xxx| 国产视频精品va久久久久久| 国产精品老熟女一区二区| 日韩不卡在线观看日韩不卡视频| 国产伦精品一区二区三区| 黄网站在线免费看| 欧美亚洲免费在线一区| 最近中文字幕无免费| 欧美破处大片在线视频| 成人网中文字幕| 日本电影在线观看网站| 在线精品亚洲一区二区不卡| 国产激情视频网站| 伊人精品视频| 成人高清在线观看| av毛片在线看| 欧美一级高清大全免费观看| 2017亚洲天堂| 麻豆精品视频在线观看免费| 日产精品高清视频免费| 性欧美又大又长又硬| 精品国产乱子伦一区| 久热这里有精品| 激情成人午夜视频| 在线观看成人av电影| 久久电影天堂| 精品久久久av| 99产精品成人啪免费网站| 亚洲男人电影天堂| 久久久九九九热| 欧美1区视频| 波多野结衣精品久久| 欧美寡妇性猛交xxx免费| 日韩精品综合一本久道在线视频| 中文字幕电影av| 国产精品一二三区在线| 欧美亚洲色图视频| 麻豆一区二区麻豆免费观看| 午夜精品久久久99热福利| 少妇高潮一区二区三区69| 午夜成人免费电影| 亚洲一区二区自偷自拍| 日本va欧美va精品发布| 亚洲午夜在线观看| 精品国产一区二| 欧美高清视频在线| 天堂在线观看免费视频| 日韩欧美国产高清91| 亚洲精品国产精品国自| 韩国成人精品a∨在线观看| avav在线播放| 丝袜连裤袜欧美激情日韩| 国产成人精品一区| 国产网友自拍视频导航网站在线观看| 日韩欧美在线网站| 日韩特级黄色片| 中文字幕不卡在线| 毛片毛片毛片毛片毛| 亚洲精品1区| 日韩一区不卡| 日韩高清一区| 欧美一区二区三区免费观看| 都市激情一区| 欧美岛国在线观看| 日韩电影在线观看一区二区| 中文字幕日本乱码精品影院| 中文在线字幕观看| 噜噜噜久久亚洲精品国产品小说| 一区二区精品免费视频| 999久久久精品一区二区| 奇米成人av国产一区二区三区| 3p在线观看| 精品福利av导航| 午夜一区二区三区四区| 一区二区三区欧美| mm131丰满少妇人体欣赏图| 国产麻豆精品theporn| 久久久精品在线视频| 中文字幕一区二区三三| 欧美日韩精品免费看 | 宅男噜噜噜66一区二区66| 精品午夜福利在线观看| 中文av一区特黄| a级一a一级在线观看| 久久av中文字幕片| 日本精品www| 欧美午夜不卡影院在线观看完整版免费| 欧美国产综合视频| 99亚洲乱人伦aⅴ精品| 国产精品夜色7777狼人| 在线手机中文字幕| 久久久久久香蕉网| 超碰超碰在线| 中文字幕最新精品| 精品99又大又爽又硬少妇毛片| 欧美刺激午夜性久久久久久久| 中文字幕久久网| 色综合久久中文字幕综合网| 国产亚洲精品女人久久久久久| 中文字幕一区二区三区四区不卡| 日本黄色特级片| 国产suv精品一区二区883| 亚洲怡红院在线| 日韩精彩视频在线观看| 国产午夜福利视频在线观看| 亚洲国产一区二区三区a毛片 | 日韩午夜av| 91视频 - 88av| 亚洲成人99| 亚洲一区尤物| 成人在线免费小视频| 欧美精品久久| 亚洲电影男人天堂| 国产在线视频欧美一区二区三区| jizz久久精品永久免费| 97人人模人人爽人人少妇| 亚洲午夜国产成人| 成人激情av在线| 亚洲一区av| 亚洲伊人一本大道中文字幕| 日本精品久久| 成人av在线亚洲| 国产精品国产亚洲精品| 国产精品入口尤物| 欧美亚洲综合视频| 成人xxxx视频| 99精品国产九九国产精品| 成人www视频在线观看| 久久9999免费视频| 91久久伊人青青碰碰婷婷| 亚洲精品午夜| 国产激情一区二区三区在线观看| 动漫3d精品一区二区三区乱码| 国产精品乱码视频| 欧洲亚洲成人| 久久久久久九九| 久草在线成人| 亚洲高清在线观看一区| 天天精品视频| 日韩精品免费一区| 99精品免费| 亚洲黄色a v| 激情五月激情综合网| a级大片免费看| 成人高清av在线| 丰满少妇一区二区| 国产欧美日韩另类视频免费观看 | 超碰在线影院| 日韩中文在线中文网在线观看 | 欧美亚洲成人免费| 国精产品一区一区三区四川| 91精品久久久久久久久久久久久久| 精品一区二区三区免费看| 国产日韩精品一区观看| 精品影片在线观看的网站| 亚洲欧美久久久久一区二区三区| 97精品国产福利一区二区三区| 老司机激情视频| 久久亚洲图片| 超碰中文字幕在线观看| 99视频热这里只有精品免费| 呻吟揉丰满对白91乃国产区| 一区二区三区欧美日| 无码人妻精品一区二| 日韩一区二区视频在线观看| 日本护士...精品国| 日韩资源在线观看| 7777kkk亚洲综合欧美网站| 国产成人综合精品| 日韩欧洲国产| 欧美视频观看一区| 欧美黄在线观看| 成人在线激情网| 国产999精品久久久久久| 老熟妇一区二区| 亚洲国产另类av| 一级做a爱片性色毛片| 日韩av在线不卡| www.久久ai| 国产精品女人网站| 麻豆精品少妇| 日本一级黄视频| 美女一区二区三区| 久久中文字幕人妻| 亚洲大片免费看| 国产精品综合在线| 亚洲天堂网站在线观看视频| 色呦呦在线观看视频| 国产精品一二三视频| 亚洲桃色综合影院| 东北少妇不带套对白| 狠狠色丁香久久婷婷综合丁香| 在线不卡av电影| 午夜成人免费视频| 亚洲国产综合网| 久久夜色撩人精品| 欧美激情三区| 亚洲欧洲精品在线观看| 日韩电影在线一区| 91精彩刺激对白露脸偷拍| 亚洲国产aⅴ天堂久久| 国产乱淫a∨片免费观看| 国产亚洲精品91在线| 英国三级经典在线观看| 俄罗斯精品一区二区| 欧美日韩专区| 国产黑丝在线视频| 日韩久久一区二区| 国产精品污视频| 中文字幕亚洲色图| 国产精品亚洲d| 日韩一二三区不卡在线视频| 三级欧美在线一区| 天天躁日日躁aaaa视频| 日韩欧美aaa| 日本v片在线免费观看| 国产69久久精品成人| 久久悠悠精品综合网| 国产精品久久久久7777| 国产91色综合久久免费分享| 全网免费在线播放视频入口| 欧美一区二区啪啪| 91精品久久久久久粉嫩| 91在线视频一区| 亚洲情侣在线| 永久看看免费大片| 亚洲第一福利视频在线| 人妻va精品va欧美va| 97精品一区二区三区| 久久资源综合| 国产午夜福利视频在线观看| 国产欧美日韩在线观看| 中文字幕人妻色偷偷久久| 中文字幕亚洲国产| 四虎国产精品永久在线国在线| 欧美 日韩 国产 在线观看| 国产一区免费电影| 国产在线视频第一页| 亚洲福利小视频| 成人性生活视频| 亚洲精蜜桃久在线| 国产一区二区美女| 久久网一区二区| 日韩精品免费在线视频| 天天免费亚洲黑人免费| 亚洲精品高清国产一线久久| 激情深爱一区二区| 国产亚洲精久久久久久无码77777| 亚洲国产天堂久久国产91| 成人影院网站| 在线视频不卡一区二区| 国产91对白在线观看九色| 西西44rtwww国产精品| 伊人久久精品视频| 欧美h版在线观看| 免费无遮挡无码永久视频| 国产视频一区在线观看| 国产强被迫伦姧在线观看无码| 久久久久国产视频| 欧美手机在线| 手机在线播放av| 日韩欧美亚洲国产一区| 老司机精品影院| 狠狠久久综合婷婷不卡| 日本欧美一区二区三区乱码| 538精品在线观看| 亚洲精品一区在线观看香蕉| 91精品福利观看| 黄色免费观看视频网站| 亚洲色图20p| 亚洲欧洲成人在线| 91久久精品国产91久久性色| 国产欧美在线| 欧美日韩午夜视频| 精品一区二区三区电影| 9999精品视频| 成人亚洲视频在线观看| 夜夜嗨av一区二区三区四季av| 极品美乳网红视频免费在线观看 | 在线看免费毛片|