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

天行健 君子當自強而不息

紋理映射基礎(6)

紋理尋址模式

Direct3D應用程序可以為任何圖元的任何頂點指定紋理坐標,通常使用的 u、v 紋理坐標的取值范圍是[0.0, 1.0],但是通過設置該范圍外的坐標值,可以得到紋理映射的特殊效果。

雖然系統允許紋理坐標取[0.0, 1.0]范圍外的值,但硬件極限常常影響紋理坐標的取值范圍。當調用函數IDirect3DDevice9::GetDeviceCaps()得到設備性能后,一個渲染設備將此極限值放在結構D3DCAPS的成員MaxTextureRepeat中。這個成員的值表示該設備能允許的紋理坐標取值范圍。例如,該值是128,那么輸入的紋理坐標必須在范圍[-128, 128]中,使用這個范圍之外的紋理坐標是無效的。

對MaxTextureRepeat的解釋也受D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE的影響。當設置了該標志位,那么結構D3DCAPS9的成員MaxTextureRepeat的使用就像前面所講的一樣;但如果沒有設置該標志位,紋理坐標范圍就根據紋理的大小和MaxTextureRepeat的值而定。假定一個紋理的大小為32 x 32像素,MaxTextureRepeat的值是512,那么512/32 = 16,有效的紋理坐標范圍就是[-16, 16]。

Direct3D定義了4種紋理尋址模式來處理紋理坐標超出[0, 1]范圍的紋理映射方法,它們分別是重疊映射尋址(wrap texture address mode)、鏡像紋理尋址(mirror texture address mode)、夾取紋理尋址(clamp texture address mode)、邊框顏色紋理尋址(border color texture address mode)。

 

重疊紋理尋址模式

使用重疊紋理尋址模式時,Direct3D會在每個整數紋理坐標連接處自動重復紋理。例如,應用程序創建了一個正方形圖元,并指定4個頂點的紋理坐標為(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。使用重疊紋理尋址,Direct3D就會在u、v方向各復制3遍原始紋理,如下圖所示:

可以調用函數IDirect3DDevice9::SetSamplerState()設置紋理尋址模式。設置第一個參數為紋理層序號,第二個參數為D3DSAMP_ADDRESSU或D3DSAMP_ADDRESSV,表示對紋理的u方向或v方向設置紋理尋址模式,第三個參數設為相應的紋理尋址模式,可以取枚舉類型D3DTEXTUREADDRESS中的一個。

Defines constants that describe the supported texture-addressing modes.

typedef enum D3DTEXTUREADDRESS
{
D3DTADDRESS_WRAP = 1,
D3DTADDRESS_MIRROR = 2,
D3DTADDRESS_CLAMP = 3,
D3DTADDRESS_BORDER = 4,
D3DTADDRESS_MIRRORONCE = 5,
D3DTADDRESS_FORCE_DWORD = 0x7fffffff,
} D3DTEXTUREADDRESS, *LPD3DTEXTUREADDRESS;

Constants

D3DTADDRESS_WRAP
Tile the texture at every integer junction. For example, for u values between 0 and 3, the texture is repeated three times; no mirroring is performed.
D3DTADDRESS_MIRROR
Similar to D3DTADDRESS_WRAP, except that the texture is flipped at every integer junction. For u values between 0 and 1, for example, the texture is addressed normally; between 1 and 2, the texture is flipped (mirrored); between 2 and 3, the texture is normal again; and so on.
D3DTADDRESS_CLAMP
Texture coordinates outside the range [0.0, 1.0] are set to the texture color at 0.0 or 1.0, respectively.
D3DTADDRESS_BORDER
Texture coordinates outside the range [0.0, 1.0] are set to the border color.
D3DTADDRESS_MIRRORONCE
Similar to D3DTADDRESS_MIRROR and D3DTADDRESS_CLAMP. Takes the absolute value of the texture coordinate (thus, mirroring around 0), and then clamps to the maximum value. The most common usage is for volume textures, where support for the full D3DTADDRESS_MIRRORONCE texture-addressing mode is not necessary, but the data is symmetric around the one axis.
D3DTADDRESS_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

下列示例代碼設置紋理層0的u, v方向尋址模式為重疊紋理尋址。

g_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
g_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

重疊紋理尋址是Direct3D中缺省的尋址模式,也是三維系統中最常用的尋址模式之一。在渲染具有諸如磚墻之類紋理的物體時,如果使用包含一整張磚墻的紋理貼圖會占用較多的內存,通常只需載入一張具有一塊或多塊磚瓦的較小的紋理貼圖,再把它按照重疊紋理尋址模式在物體表面映射多次,就可以達到和使用整張磚墻貼圖同樣的效果。

 

鏡像紋理尋址模式

使用鏡像紋理尋址模式時,Direct3D會在每個整數紋理坐標連接處自動復制并翻轉紋理。例如,應用程序創建了一個正方形圖元,并指定4個頂點的紋理坐標為(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。采用鏡像紋理尋址模式,Direct3D就會在u、v方向各復制3遍并翻轉原始紋理圖,所有的行和列都是前一行或列的鏡像,如下圖所示:

用枚舉類型D3DTEXTUREADDRESS的成員D3DTADDRESS_MIRROR指定鏡像紋理尋址模式。下面的示例代碼設置紋理層0的u、v方向尋址模式為鏡像紋理尋址模式:

g_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
g_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);

 

夾取紋理尋址模式

夾取紋理尋址模式將紋理坐標夾取在[0.0, 1.0]范圍之內。也就是說,它將紋理復制一遍,然后將紋理邊緣像素的顏色延伸。例如,應用程序創建了一個正方形圖元,并指定4個頂點的紋理坐標為(0.0, 0.0)、(0.0, 3.0)、(3.0, 3.0)、(3.0, 0.0)。將u、v方向上的紋理尋址模式都設置為夾取紋理尋址模式時的效果如下圖所示:

原紋理

使用夾取紋理尋址模式后的效果圖

用枚舉類型D3DTEXTUREADDRESS的成員D3DTADDRESS_CLAMP指定夾取紋理尋址模式。下面的示例代碼設置紋理層0的u、v方向尋址模式為夾取紋理尋址模式:

g_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
g_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

 

邊框顏色紋理尋址模式

邊框顏色紋理尋址模式用枚舉類型D3DTEXTUREADDRESS的成員D3DTADDRESS_BORDER指定,當紋理坐標超出[0.0, 1.0]范圍時,Direct3D使用邊框顏色代替紋理顏色。

邊框顏色通過調用函數IDirect3DDevice9::SetSamplerState()設置,第一個參數設為紋理層序號,第二個參數設為D3DSAMP_BORDERCOLOR,第三個參數設為所需的邊框顏色,為D3DCOLOR類型,以32位整數表示A、R、G、B顏色。下面的示例代碼指定邊框顏色為紅色,并設置紋理層0的u、v方向尋址模式為邊框顏色紋理尋址模式。

g_device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0xFFFF0000);
g_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
g_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);

渲染的結果如下圖所示:

原紋理

使用邊框顏色紋理尋址模式后的效果圖

 

紋理尋址模式示例程序

示例程序演示了重疊紋理尋址、鏡像紋理尋址、夾取紋理尋址和邊框顏色紋理尋址4種不同的紋理尋址模式的效果,其效果圖如上面貼圖所示。

#include <d3dx9.h>

#pragma warning(disable : 
4127)

#define TEXTURE_ADDRESS_WRAP    1
#define TEXTURE_ADDRESS_MIRROR    2
#define TEXTURE_ADDRESS_CLAMP    3
#define TEXTURE_ADDRESS_BORDER    4

#define CLASS_NAME    "GameApp"

#define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
IDirect3DVertexBuffer9
* g_vertex_buffer;
IDirect3DTexture9
*        g_texture1;
IDirect3DTexture9
*        g_texture2;
int                        g_texture_address_mode = TEXTURE_ADDRESS_WRAP;

struct sCustomVertex
{
    
float x, y, z;
    
float u, v;
};

#define D3DFVF_CUSTOM_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1) 

void setup_matrices()
{
    
// build world matrix
    
    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);

    
// setup view matrix

    D3DXVECTOR3 eye(
0.0f0.0f-10.0f);
    D3DXVECTOR3 at(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

    D3DXMATRIX mat_view;
    D3DXMatrixLookAtLH(
&mat_view, &eye, &at, &up);
    g_device
->SetTransform(D3DTS_VIEW, &mat_view);

    
// setup projection matrix

    D3DXMATRIX mat_proj;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/41.0f1.0f100.0f);
    g_device
->SetTransform(D3DTS_PROJECTION, &mat_proj);
}

bool init_graphics()
{    
    
if(FAILED(D3DXCreateTextureFromFile(g_device, "texture1.bmp"&g_texture1)))
    {
        MessageBox(NULL, 
"Create texture failed!""ERROR", MB_OK);
        
return false;
    }

    
if(FAILED(D3DXCreateTextureFromFile(g_device, "texture2.bmp"&g_texture2)))
    {
        MessageBox(NULL, 
"Create texture failed!""ERROR", MB_OK);
        
return false;
    }

    sCustomVertex vertices[] 
=
    {
        { 
-3,   -3,  0.0f,  0.0f3.0f},   
        { 
-3,    3,  0.0f,  0.0f0.0f},    
        {  
3,   -3,  0.0f,  3.0f3.0f},    
        {  
3,    3,  0.0f,  3.0f0.0f }

    };

    g_device
->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_MANAGED, &g_vertex_buffer, NULL);

    
void* ptr;

    g_vertex_buffer
->Lock(00, (void**)&ptr, 0);
    memcpy(ptr, vertices, 
sizeof(vertices));    
    g_vertex_buffer
->Unlock();

    
return true;
}

bool init_d3d(HWND hwnd)
{
    g_d3d 
= Direct3DCreate9(D3D_SDK_VERSION);

    
if(g_d3d == NULL)
        
return false;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(
&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed            
= TRUE;
    d3dpp.SwapEffect        
= D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat    
= D3DFMT_UNKNOWN;

    
if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  
&d3dpp, &g_device)))
    {
        
return false;
    }
    
    
if(! init_graphics())
        
return false;

    setup_matrices();

    g_device
->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_device
->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
    
    
return true;
}

void cleanup()
{
    release_com(g_texture1);
    release_com(g_texture2);
    release_com(g_vertex_buffer);
    release_com(g_device);
    release_com(g_d3d);
}

void setup_texture()
{
    
switch(g_texture_address_mode)
    {
    
case TEXTURE_ADDRESS_WRAP:
        g_device
->SetTexture(0, g_texture1);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
        
break;

    
case TEXTURE_ADDRESS_MIRROR:
        g_device
->SetTexture(0, g_texture1);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
        
break;

    
case TEXTURE_ADDRESS_CLAMP:
        g_device
->SetTexture(0, g_texture2);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
        
break;

    
case TEXTURE_ADDRESS_BORDER:
        g_device
->SetTexture(0, g_texture2);
        g_device
->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0xFFFF0000);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
        g_device
->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
        
break;        
    }
}

void render()
{
    g_device
->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(555), 1.0f0);

    g_device
->BeginScene();

    setup_texture();

    g_device
->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
    g_device
->SetFVF(D3DFVF_CUSTOM_VERTEX);
    g_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);
}

LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_KEYDOWN:
        
switch(wParam)
        {
        
case VK_ESCAPE:
            DestroyWindow(hwnd);
            
break;

        
case 49:    // press key "1"
            g_texture_address_mode = TEXTURE_ADDRESS_WRAP;
            
break;

        
case 50:    // press key "2"
            g_texture_address_mode = TEXTURE_ADDRESS_MIRROR;
            
break;

        
case 51:    // press key "3"
            g_texture_address_mode = TEXTURE_ADDRESS_CLAMP;
            
break;

        
case 52:    // press key "4"
            g_texture_address_mode = TEXTURE_ADDRESS_BORDER;
            
break;        
        }        
            
        
break;    

    
case WM_DESTROY:        
        PostQuitMessage(
0);
        
return 0;
    }

    
return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
{
    WNDCLASSEX wc;

    wc.cbSize            
= sizeof(WNDCLASSEX);
    wc.style            
= CS_CLASSDC;
    wc.lpfnWndProc        
= WinProc;
    wc.cbClsExtra        
= 0;
    wc.cbWndExtra        
= 0;
    wc.hInstance        
= inst;
    wc.hIcon            
= NULL;
    wc.hCursor            
= NULL;
    wc.hbrBackground    
= NULL;
    wc.lpszMenuName        
= NULL;
    wc.lpszClassName    
= CLASS_NAME;
    wc.hIconSm            
= NULL;

    
if(! RegisterClassEx(&wc))
        
return -1;

    HWND hwnd 
= CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100480480,
                             NULL, NULL, wc.hInstance, NULL);    

    
if(hwnd == NULL)
        
return -1;

    
if(init_d3d(hwnd))
    {
        ShowWindow(hwnd, SW_SHOWDEFAULT);
        UpdateWindow(hwnd);

        MSG msg;
        ZeroMemory(
&msg, sizeof(msg));

        
while(msg.message != WM_QUIT)
        {
            
if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
            {
                TranslateMessage(
&msg);
                DispatchMessage(
&msg);
            }
                
            render();
            Sleep(
10);
        }
    }

    cleanup();
    UnregisterClass(CLASS_NAME, wc.hInstance);    

    
return 0;
}

 

posted on 2008-05-07 14:03 lovedday 閱讀(3870) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产日韩在线| 黄色成人av在线| 在线视频亚洲| 一区二区高清| 一区二区精品国产| 日韩视频亚洲视频| 一本一本久久a久久精品牛牛影视| 欧美激情一区二区三区蜜桃视频| 老鸭窝亚洲一区二区三区| 美日韩精品免费| 亚洲成人在线视频网站| 亚洲国产精品福利| 99re8这里有精品热视频免费| 在线一区二区视频| 欧美一区二区三区免费观看| 久久综合狠狠综合久久综青草 | 久久精品国产2020观看福利| 久久久久久久999| 裸体一区二区三区| 欧美网站在线观看| 精品69视频一区二区三区| 亚洲大胆美女视频| 亚洲无人区一区| 久久精品女人天堂| 亚洲福利视频三区| 午夜久久福利| 欧美精品国产一区| 国产欧美日韩91| 亚洲激情专区| 亚洲欧美日韩国产| 欧美国产日本| 午夜精品久久久久久久久 | 久久影音先锋| 麻豆国产va免费精品高清在线| 在线精品国精品国产尤物884a| 在线亚洲观看| 欧美国产精品人人做人人爱| 亚洲一区在线播放| 欧美激情亚洲国产| 激情欧美一区二区三区| 亚洲专区一区| 亚洲三级毛片| 久热精品视频在线| 国产在线国偷精品产拍免费yy| 日韩亚洲欧美成人| 美脚丝袜一区二区三区在线观看| 一区二区三区四区国产| 欧美福利网址| 在线成人av| 久久www成人_看片免费不卡| 亚洲三级免费| 欧美精品亚洲| 99在线|亚洲一区二区| 美女视频黄a大片欧美| 午夜精品福利一区二区蜜股av| 欧美色区777第一页| 日韩视频免费观看高清在线视频| 免费观看成人网| 久久久久久9| 亚洲福利国产| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美有码在线观看视频| 国产视频在线观看一区二区三区| 亚洲视频在线一区| 夜夜躁日日躁狠狠久久88av| 欧美日韩爆操| 亚洲午夜电影网| 9久re热视频在线精品| 欧美日韩免费区域视频在线观看| 亚洲裸体俱乐部裸体舞表演av| 亚洲日韩欧美视频一区| 欧美日韩三级电影在线| 亚洲天堂av综合网| 亚洲视屏在线播放| 国产欧美精品久久| 久久久噜噜噜久久中文字幕色伊伊| 欧美影院成年免费版| 国产一区二区久久| 久久夜色精品国产噜噜av| 久久夜色精品国产亚洲aⅴ | 亚洲欧美日韩另类| 国产视频久久久久| 久久亚洲一区二区| 欧美高清你懂得| 亚洲少妇中出一区| 欧美一级专区免费大片| 亚洲第一在线综合网站| 亚洲人成在线观看一区二区| 国产精品电影网站| 久久久久久久成人| 欧美成人在线免费视频| 欧美精品免费看| 国产精品av一区二区| 午夜亚洲精品| 久久久久一本一区二区青青蜜月| 亚洲欧洲在线播放| 在线视频欧美日韩| 极品少妇一区二区| 亚洲欧洲日产国码二区| 国产欧美日韩伦理| 91久久久国产精品| 国产午夜亚洲精品理论片色戒| 欧美mv日韩mv国产网站| 欧美日韩一区二区三区四区在线观看 | 久久综合九色欧美综合狠狠| 亚洲久久视频| 亚洲欧美在线一区二区| 91久久久久久久久| 亚洲欧美视频一区| 日韩亚洲精品在线| 久久久久久久久久久久久9999| 亚洲网站在线观看| 久久久天天操| 欧美一区二区三区视频在线| 欧美激情视频给我| 欧美暴力喷水在线| 国产午夜精品一区二区三区欧美| 日韩天堂av| 91久久综合亚洲鲁鲁五月天| 欧美一区二区三区久久精品茉莉花| 中日韩在线视频| 欧美电影专区| 亚洲成色www8888| 国户精品久久久久久久久久久不卡| 亚洲精品乱码久久久久久日本蜜臀| 韩国av一区二区| 亚洲欧美一区二区原创| 一区二区三区精品| 欧美激情国产日韩精品一区18| 欧美freesex交免费视频| 国内一区二区在线视频观看| 亚洲自拍偷拍色片视频| 亚洲一区二区成人在线观看| 欧美精品一区二| 欧美激情国产精品| 在线观看一区| 欧美中文在线视频| 久久精品国产一区二区三| 国产精品国产三级国产专播品爱网 | 久久久www成人免费无遮挡大片| 先锋影音一区二区三区| 欧美日韩一二三四五区| 亚洲伦伦在线| 亚洲一区二区成人| 国产精品国产三级国产| 亚洲综合精品四区| 欧美自拍丝袜亚洲| 国产欧美欧美| 久久亚洲美女| 国产精品视频免费| 亚洲免费在线精品一区| 欧美伊人久久| 国产日韩欧美| 久久久噜噜噜久久久| 欧美成人自拍| 91久久久亚洲精品| 欧美视频免费在线| 亚洲欧美在线看| 久热成人在线视频| 亚洲精品一区二区在线观看| 欧美区国产区| 亚洲在线电影| 久久乐国产精品| 亚洲精品国产精品久久清纯直播| 欧美精品在线网站| 中国女人久久久| 久久在线91| 99精品热视频| 国产午夜精品久久久久久久| 欧美成人性生活| 亚洲一区二区三区国产| 蜜桃精品久久久久久久免费影院| 91久久国产综合久久| 国产精品高清免费在线观看| 久久人人爽人人爽| 亚洲一级二级| 欧美va亚洲va日韩∨a综合色| 夜夜嗨网站十八久久 | 亚洲国产日韩欧美在线图片| 欧美精品一区在线发布| 午夜精品久久久久久久久| 亚洲国产91| 欧美自拍偷拍午夜视频| 99热这里只有成人精品国产| 国模一区二区三区| 欧美日韩一区二区三区高清| 久久一区中文字幕| 亚洲视频在线二区| 91久久精品一区| 久久综合国产精品| 亚洲小说春色综合另类电影| 亚洲第一中文字幕| 国产亚洲成av人在线观看导航| 欧美久久久久久久| 久久久噜噜噜久久中文字免| 亚洲欧美日韩综合一区| 夜夜爽av福利精品导航| 最新高清无码专区| 欧美成ee人免费视频| 久久精品2019中文字幕|