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

天行健 君子當自強而不息

高級紋理映射技術(6)

對一些特殊的應用需要對紋理坐標進行處理,主要包括紋理坐標自動生成和紋理坐標變換。下圖顯示了紋理坐標的來源、處理過程以及到達光柵處理器的過程。

 

紋理坐標自動生成

在Direct3D程序中,不僅可以在模型載入階段或渲染階段指定物體的紋理坐標,還可以通過Direct3D渲染引擎自動生成紋理坐標,用于諸如環境映射等特殊的視覺效果。與手動設置紋理坐標相比,紋理坐標自動生成在Direct3D坐標 變換和光照流水線中完成,執行速度更快。

Direct3D系統可以使用經過變換的攝像機空間頂點位置坐標、法線信息來生成紋理坐標。如果使用紋理坐標自動生成,那么在頂點中就可以不用包含紋理坐標數據,從而可以降低圖形渲染時的數據傳輸量。紋理坐標自動生成主要用于產生一些特殊效果,在大多數情況下還是手工為每個頂點指定紋理坐標。

通過調用SetTextureStageState()并將第二個參數設置為D3DTSS_TEXCOORDINDEX來控制Direct3D系統如何自動生成紋理坐標。

D3DTSS_TEXCOORDINDEX
Index of the texture coordinate set to use with this texture stage. You can specify up to eight sets of texture coordinates per vertex. If a vertex does not include a set of texture coordinates at the specified index, the system defaults to the u and v coordinates (0,0).

When rendering using vertex shaders, each stage's texture coordinate index must be set to its default value. The default index for each stage is equal to the stage index. Set this state to the zero-based index of the coordinate set for each vertex that this texture stage uses.

Additionally, applications can include, as logical OR with the index being set, one of the constants to request that Direct3D automatically generate the input texture coordinates for a texture transformation. For a list of all the constants, see D3DTSS_TCI.

With the exception of D3DTSS_TCI_PASSTHRU, which resolves to zero, if any of the following values is included with the index being set, the system uses the index strictly to determine texture wrapping mode. These flags are most useful when performing environment mapping.

其中第三個參數可以設為下列列表中的成員:

D3DTSS_TCI

Driver texture coordinate capability flags.

#define Value Description
D3DTSS_TCI_PASSTHRU 0x00000000L Use the specified texture coordinates contained within the vertex format. This value resolves to zero.
D3DTSS_TCI_CAMERASPACENORMAL 0x00010000L Use the vertex normal, transformed to camera space, as the input texture coordinates for this stage's texture transformation.
D3DTSS_TCI_CAMERASPACEPOSITION 0x00020000L Use the vertex position, transformed to camera space, as the input texture coordinates for this stage's texture transformation.
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000L Use the reflection vector, transformed to camera space, as the input texture coordinate for this stage's texture transformation. The reflection vector is computed from the input vertex position and normal vector.
D3DTSS_TCI_SPHEREMAP 0x00040000L Use the specified texture coordinates for sphere mapping.

These constants are used by D3DTSS_TEXCOORDINDEX.

D3DTSS_TEXCOORDINDEX用于指定特定紋理層使用頂點中的第幾組紋理坐標,但如果指定了上表中的成員值,Direct3D將忽略頂點中的紋理坐標,轉而使用自動生成的紋理坐標。

D3DTSS_TEXTURETRANSFORMFLAGS用來控制生成的紋理坐標的輸出,在大多數情況下紋理坐標是二維的,即將D3DTSS_TEXTURETRANSFORMFLAGS設置為D3DTTFF_COUNT2。但當繪制線段或三維紋理時,紋理坐標可能是一維或三維的。

D3DTSS_TEXTURETRANSFORMFLAGS
Member of the D3DTEXTURETRANSFORMFLAGS enumerated type that controls the transformation of texture coordinates for this texture stage. The default value is D3DTTFF_DISABLE.

輸出的紋理坐標維數由枚舉類型D3DTSS_TEXTURETRANSFORMFLAGS指定,其定義如下:

Defines texture coordinate transformation values.

typedef enum D3DTEXTURETRANSFORMFLAGS
{
D3DTTFF_DISABLE = 0,
D3DTTFF_COUNT1 = 1,
D3DTTFF_COUNT2 = 2,
D3DTTFF_COUNT3 = 3,
D3DTTFF_COUNT4 = 4,
D3DTTFF_PROJECTED = 256,
D3DTTFF_FORCE_DWORD = 0x7fffffff,
} D3DTEXTURETRANSFORMFLAGS, *LPD3DTEXTURETRANSFORMFLAGS;

Constants

D3DTTFF_DISABLE
Texture coordinates are passed directly to the rasterizer.
D3DTTFF_COUNT1
The rasterizer should expect 1D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT2
The rasterizer should expect 2D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT3
The rasterizer should expect 3D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_COUNT4
The rasterizer should expect 4D texture coordinates. This value is used by fixed function vertex processing; it should be set to 0 when using a programmable vertex shader.
D3DTTFF_PROJECTED
This flag is honored by the fixed function pixel pipeline, as well as the programmable pixel pipeline in versions ps_1_1 to ps_1_3. When texture projection is enabled for a texture stage, all four floating point values must be written to the corresponding texture register. Each texture coordinate is divided by the last element before being passed to the rasterizer. For example, if this flag is specified with the D3DTTFF_COUNT3 flag, the first and second texture coordinates are divided by the third coordinate before being passed to the rasterizer.
D3DTTFF_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.

Remarks

Texture coordinates can be transformed using a 4 x 4 matrix before the results are passed to the rasterizer. The texture coordinate transforms are set by calling IDirect3DDevice9::SetTextureStageState, and by passing in the D3DTSS_TEXTURETRANSFORMFLAGS texture stage state and one of the values from D3DTEXTURETRANSFORMFLAGS. For more information about texture transforms, see Texture Coordinate Transformations (Direct3D 9).

首先,我們定義頂點結構和格式:

struct sCustomVertex
{
float x, y, z;
};
#define D3DFVF_CUSTOM_VERTEX	D3DFVF_XYZ

接著生成頂點數據,頂點數據中沒有包含紋理坐標:

// create vertex buffer and fill data
sCustomVertex vertices[] = 	
{
{ -1.0f, -1.0f, 0.0f},
{ -1.0f, 1.0f, 0.0f},
{ 1.0f, -1.0f, 0.0f},
{ 1.0f, 1.0f, 0.0f}
};
pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_MANAGED, &g_vertex_buffer, NULL);
void* ptr;
g_vertex_buffer->Lock(0, sizeof(vertices), (void**)&ptr, 0);
memcpy(ptr, vertices, sizeof(vertices));
g_vertex_buffer->Unlock();

然后讓Direct3D自動生成紋理坐標:

// create texture coordinate using vertex position in camera space
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);

運行效果:

若設置D3DTSS_TEXCOORDINDEX為以下D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR,則效果為:

若設置D3DTSS_TEXCOORDINDEX為以下D3DTSS_TCI_SPHEREMAP,則效果為:

 

主程序:

#include "dxstdafx.h"
#include 
"resource.h"

#pragma warning(disable : 
4127 4995 4996)

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

#define IDC_TOGGLE_FULLSCREEN        1
#define IDC_TOGGLE_REF                2
#define IDC_CHANGE_DEVICE            3

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

#define D3DFVF_CUSTOM_VERTEX    D3DFVF_XYZ

const D3DXCOLOR FONT_COLOR(0.55f0.85f0.65f1.0f);

CDXUTDialogResourceManager    g_dlg_resource_manager;
CD3DSettingsDlg                g_settings_dlg;
CDXUTDialog                    g_button_dlg;

IDirect3DVertexBuffer9
*        g_vertex_buffer;
IDirect3DTexture9
*            g_texture;

ID3DXFont
*        g_font;
ID3DXSprite
*    g_text_sprite;
bool            g_show_help;

//--------------------------------------------------------------------------------------
// Rejects any devices that aren't acceptable by returning false
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 
                                  D3DFORMAT BackBufferFormat, 
bool bWindowed, void* pUserContext )
{
    
// Typically want to skip backbuffer formats that don't support alpha blending

    IDirect3D9
* pD3D = DXUTGetD3DObject(); 

    
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType, AdapterFormat, 
                    D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
        
return false;

    
return true;
}


//--------------------------------------------------------------------------------------
// Before a device is created, modify the device settings as needed.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )
{
    
// If video card does not support hardware vertex processing, then uses sofaware vertex processing.
    if((pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0)
        pDeviceSettings
->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    
static bool is_first_time = true;

    
if(is_first_time)
    {
        is_first_time 
= false;

        
// if using reference device, then pop a warning message box.
        if(pDeviceSettings->DeviceType == D3DDEVTYPE_REF)
            DXUTDisplaySwitchingToREFWarning();
    }

    
return true;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_MANAGED resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, 
                                 
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                 
void* pUserContext )
{
    HRESULT    hr;

    V_RETURN(g_dlg_resource_manager.OnCreateDevice(pd3dDevice));
    V_RETURN(g_settings_dlg.OnCreateDevice(pd3dDevice));

    D3DXCreateFont(pd3dDevice, 
180, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
                   DEFAULT_PITCH 
| FF_DONTCARE, L"Arial"&g_font);

    V_RETURN(D3DXCreateTextureFromFile(pd3dDevice, L
"texture.jpg",    &g_texture));
    
    
// create vertex buffer and fill data

    sCustomVertex vertices[] 
=     
    {
        { 
-1.0f-1.0f,  0.0f},
        { 
-1.0f,  1.0f,  0.0f},
        {  
1.0f-1.0f,  0.0f},
        {  
1.0f,  1.0f,  0.0f}
    };

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

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

    
return S_OK;
}


//--------------------------------------------------------------------------------------
// Create any D3DPOOL_DEFAULT resources here 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, 
                                
void* pUserContext )
{
    HRESULT hr;

    V_RETURN(g_dlg_resource_manager.OnResetDevice());
    V_RETURN(g_settings_dlg.OnResetDevice());
    V_RETURN(g_font
->OnResetDevice());
    V_RETURN(D3DXCreateSprite(pd3dDevice, 
&g_text_sprite));

    
// set dialog position and size

    g_button_dlg.SetLocation(pBackBufferSurfaceDesc
->Width - 1700);
    g_button_dlg.SetSize(
170170);

    
// setup world matrix
    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    pd3dDevice
->SetTransform(D3DTS_WORLD, &mat_world);

    
// setup view matrix

    D3DXMATRIX mat_view;
    D3DXVECTOR3 eye(
0.0f0.0f-3.0f);
    D3DXVECTOR3  at(
0.0f0.0f,  0.0f);
    D3DXVECTOR3  up(
0.0f1.0f,  0.0f);

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

    
// set projection matrix
    D3DXMATRIX mat_proj;
    
float aspect = (float)pBackBufferSurfaceDesc->Width / pBackBufferSurfaceDesc->Height;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/4, aspect, 1.0f100.0f);
    pd3dDevice
->SetTransform(D3DTS_PROJECTION, &mat_proj);

    pd3dDevice
->SetRenderState(D3DRS_LIGHTING, FALSE);

    
// set texture color blend method, disalbe alpha blend.

    pd3dDevice
->SetTexture(0, g_texture);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLORARG1,        D3DTA_TEXTURE);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_COLOROP,            D3DTOP_SELECTARG1);    
    pd3dDevice
->SetTextureStageState(0, D3DTSS_ALPHAOP,            D3DTOP_DISABLE);

    
// create texture coordinate using vertex position in camera space 
    pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_CAMERASPACEPOSITION);
    
//pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
    
//pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,            D3DTSS_TCI_SPHEREMAP);    
    pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,    D3DTTFF_COUNT2);

    
return S_OK;
}

//--------------------------------------------------------------------------------------
// Release resources created in the OnResetDevice callback here 
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{
    g_dlg_resource_manager.OnLostDevice();
    g_settings_dlg.OnLostDevice();
    g_font
->OnLostDevice();

    release_com(g_text_sprite);
}


//--------------------------------------------------------------------------------------
// Release resources created in the OnCreateDevice callback here
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{
    g_dlg_resource_manager.OnDestroyDevice();
    g_settings_dlg.OnDestroyDevice();    

    release_com(g_font);
    release_com(g_vertex_buffer);
    release_com(g_texture);
}

//--------------------------------------------------------------------------------------
// Handle updates to the scene
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
}

//--------------------------------------------------------------------------------------
// Render the helper information
//--------------------------------------------------------------------------------------
void RenderText()
{
    CDXUTTextHelper text_helper(g_font, g_text_sprite, 
20);
    
    text_helper.Begin();

    
// show frame and device states
    text_helper.SetInsertionPos(55);
    text_helper.SetForegroundColor(FONT_COLOR);
    text_helper.DrawTextLine( DXUTGetFrameStats(
true) );
    text_helper.DrawTextLine( DXUTGetDeviceStats() );

    
// show other simple information
    text_helper.SetForegroundColor( D3DXCOLOR(1.0f1.0f1.0f1.0f) );
    text_helper.DrawTextLine(L
"Texture Coordinate Automatic Generate");

    
// show helper information
    
    
const D3DSURFACE_DESC* surface_desc = DXUTGetBackBufferSurfaceDesc();

    
if(g_show_help)
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 18 * 5);
        text_helper.SetForegroundColor(FONT_COLOR);
        text_helper.DrawTextLine(L
"Controls (F1 to hide):");
        
        text_helper.SetInsertionPos(
40, surface_desc->Height - 18 * 4);
        text_helper.DrawTextLine(L
"Quit: ESC");
    }
    
else
    {
        text_helper.SetInsertionPos(
10, surface_desc->Height - 15 * 4);
        text_helper.SetForegroundColor( D3DXCOLOR(
1.0f1.0f1.0f1.0f) );
        text_helper.DrawTextLine(L
"Press F1 for help");
    }

    text_helper.End();
}

//--------------------------------------------------------------------------------------
// Render the scene 
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

    
if(g_settings_dlg.IsActive())
    {
        g_settings_dlg.OnRender(fElapsedTime);
        
return;
    }

    
// Clear the render target and the zbuffer 
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0000), 1.0f0) );

    
// Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        pd3dDevice
->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
        pd3dDevice
->SetFVF(D3DFVF_CUSTOM_VERTEX);
        pd3dDevice
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

        RenderText();

        V(g_button_dlg.OnRender(fElapsedTime));

        V( pd3dDevice
->EndScene() );
    }
}


//--------------------------------------------------------------------------------------
// Handle messages to the application 
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
                          
bool* pbNoFurtherProcessing, void* pUserContext )
{
    
*pbNoFurtherProcessing = g_dlg_resource_manager.MsgProc(hWnd, uMsg, wParam, lParam);
    
if(*pbNoFurtherProcessing)
        
return 0;

    
if(g_settings_dlg.IsActive())
    {
        g_settings_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
        
return 0;
    }

    
*pbNoFurtherProcessing = g_button_dlg.MsgProc(hWnd, uMsg, wParam, lParam);
    
if(*pbNoFurtherProcessing)
        
return 0;

    
return 0;
}


//--------------------------------------------------------------------------------------
// Handle keybaord event
//--------------------------------------------------------------------------------------
void CALLBACK OnKeyboardProc(UINT charater, bool is_key_down, bool is_alt_down, void* user_context)
{
    
if(is_key_down)
    {
        
switch(charater)
        {
        
case VK_F1:
            g_show_help 
= !g_show_help;
            
break;
        }
    }
}

//--------------------------------------------------------------------------------------
// Handle events for controls
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT eventint control_id, CDXUTControl* control, void* user_context)
{
    
switch(control_id)
    {
    
case IDC_TOGGLE_FULLSCREEN:
        DXUTToggleFullScreen();
        
break;

    
case IDC_TOGGLE_REF:
        DXUTToggleREF();
        
break;

    
case IDC_CHANGE_DEVICE:
        g_settings_dlg.SetActive(
true);
        
break;
    }
}

//--------------------------------------------------------------------------------------
// Initialize dialogs
//--------------------------------------------------------------------------------------
void InitDialogs()
{
    g_settings_dlg.Init(
&g_dlg_resource_manager);
    g_button_dlg.Init(
&g_dlg_resource_manager);

    g_button_dlg.SetCallback(OnGUIEvent);

    
int x = 35, y = 10, width = 125, height = 22;

    g_button_dlg.AddButton(IDC_TOGGLE_FULLSCREEN, L
"Toggle full screen", x, y,         width, height);
    g_button_dlg.AddButton(IDC_TOGGLE_REF,          L
"Toggle REF (F3)",     x, y += 24, width, height);
    g_button_dlg.AddButton(IDC_CHANGE_DEVICE,      L
"Change device (F2)", x, y += 24, width, height, VK_F2);    
}

//--------------------------------------------------------------------------------------
// Initialize everything and go into a render loop
//--------------------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF 
| _CRTDBG_LEAK_CHECK_DF );
#endif

    
// Set the callback functions
    DXUTSetCallbackDeviceCreated( OnCreateDevice );
    DXUTSetCallbackDeviceReset( OnResetDevice );
    DXUTSetCallbackDeviceLost( OnLostDevice );
    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackFrameRender( OnFrameRender );
    DXUTSetCallbackFrameMove( OnFrameMove );
    DXUTSetCallbackKeyboard(OnKeyboardProc);
   
    
// TODO: Perform any application-level initialization here
    InitDialogs();

    
// Initialize DXUT and create the desired Win32 window and Direct3D device for the application
    DXUTInit( truetruetrue ); // Parse the command line, handle the default hotkeys, and show msgboxes
    DXUTSetCursorSettings( truetrue ); // Show the cursor and clip it when in full screen
    DXUTCreateWindow( L"Texture Color And Alpha Blend" );
    DXUTCreateDevice( D3DADAPTER_DEFAULT, 
true640480, IsDeviceAcceptable, ModifyDeviceSettings );

    
// Start the render loop
    DXUTMainLoop();

    
// TODO: Perform any application-level cleanup here

    
return DXUTGetExitCode();
}

 

下載示例工程


posted on 2008-05-20 18:47 lovedday 閱讀(3680) 評論(1)  編輯 收藏 引用

評論

# re: 高級紋理映射技術(6) 2011-07-20 10:49 王聰

D3DTSS_TCI 中的tci可以理解 成texturecoord constant index嗎?  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            午夜精品久久久久久久久久久| 先锋影音国产一区| 亚洲电影免费在线| 美女脱光内衣内裤视频久久网站| 国语自产精品视频在线看| 久久久久久久91| 久久精品国产精品亚洲| 在线观看的日韩av| 亚洲精品国产精品国自产观看浪潮| 久久精品国产第一区二区三区| 亚洲免费在线播放| 国产人成一区二区三区影院| 久久久久国产精品www| 久久er精品视频| 亚洲国产精品一区| 久久国产精品黑丝| 久久久久亚洲综合| 亚洲精品影视| 亚洲一区观看| 亚洲成色www久久网站| 欧美影片第一页| 久久综合九色九九| 一道本一区二区| 小黄鸭精品aⅴ导航网站入口| 激情婷婷欧美| av不卡免费看| 亚洲夫妻自拍| 中文在线资源观看网站视频免费不卡| 国产日韩欧美黄色| 亚洲激情综合| 欧美激情久久久| 欧美一区二区三区免费观看| 久久一区二区三区四区五区| 亚洲一区在线直播| 久久夜色精品国产欧美乱极品| 亚洲破处大片| 欧美综合77777色婷婷| 艳妇臀荡乳欲伦亚洲一区| 午夜精品一区二区三区四区 | 久久精品日韩一区二区三区| 亚洲精品免费在线| 欧美在线免费| 亚洲在线视频免费观看| 免费看黄裸体一级大秀欧美| 欧美在线一二三四区| 欧美日韩国产首页| 欧美成年人视频网站| 欧美网站在线观看| 亚洲第一中文字幕在线观看| 国产亚洲午夜高清国产拍精品| 99在线|亚洲一区二区| 亚洲欧洲日本mm| 久久久www成人免费毛片麻豆| 亚洲欧美日韩久久精品| 欧美色123| 亚洲精品久久久蜜桃| 最新69国产成人精品视频免费| 久久av红桃一区二区小说| 午夜精品999| 欧美视频一区二区三区| 99精品热视频只有精品10| 亚洲精品国产精品乱码不99按摩| 久久亚洲综合色| 乱中年女人伦av一区二区| 国产亚洲欧美另类中文| 亚洲欧美日本视频在线观看| 午夜电影亚洲| 国产精品尤物| 先锋影音一区二区三区| 久久精品国产999大香线蕉| 国产精品影视天天线| 香蕉av777xxx色综合一区| 午夜性色一区二区三区免费视频| 国产精品v亚洲精品v日韩精品| 日韩视频永久免费| 香蕉国产精品偷在线观看不卡| 国产精品国产亚洲精品看不卡15| 日韩亚洲国产精品| 午夜国产一区| 伊人男人综合视频网| 欧美成人蜜桃| 一本大道久久精品懂色aⅴ| 亚洲欧美综合精品久久成人| 国产亚洲一区二区三区在线播放| 久久久久国产成人精品亚洲午夜| 欧美大片国产精品| 一区二区三区精品国产| 国产精品极品美女粉嫩高清在线| 亚洲欧美日韩精品久久久久| 另类av导航| 99精品视频免费| 国产精品久久午夜| 久久精品中文字幕一区| 亚洲黄色成人| 欧美一区二区三区视频免费播放| 在线观看亚洲精品| 欧美久久一区| 性做久久久久久免费观看欧美| 欧美aaa级| 亚洲一区999| 久久免费视频在线观看| 亚洲欧洲日夜超级视频| 亚洲欧美在线免费观看| 亚洲国产精品精华液2区45| 欧美日韩蜜桃| 久久久久久网址| 在线综合亚洲| 欧美激情欧美狂野欧美精品 | 国产日韩欧美一二三区| 蜜臀av国产精品久久久久| 亚洲午夜日本在线观看| 女主播福利一区| 欧美一级二区| 夜夜精品视频| 1000部国产精品成人观看| 国产精品久久久久久久久久直播| 久久综合伊人77777蜜臀| 亚洲欧美激情视频在线观看一区二区三区| 免费成人性网站| 欧美专区福利在线| 中文精品视频| 亚洲美女av电影| 伊人影院久久| 国产在线国偷精品产拍免费yy| 欧美日韩国产色站一区二区三区| 久久久国际精品| 小黄鸭精品aⅴ导航网站入口| 亚洲美女在线观看| 亚洲高清资源| 欧美大胆成人| 欧美成人一区二免费视频软件| 久久精品成人| 欧美在线视频导航| 亚洲欧美一区二区激情| 在线天堂一区av电影| a91a精品视频在线观看| 亚洲精品乱码| 日韩视频在线观看免费| 亚洲人成网站色ww在线| 亚洲国产精品999| 原创国产精品91| 精品999久久久| 黄色成人在线网址| 激情视频一区二区三区| 一区二区三区在线免费播放| 国产专区一区| 亚洲第一黄网| 亚洲精品你懂的| 亚洲精品国产无天堂网2021| 亚洲精品免费看| 夜夜嗨av一区二区三区网页| 亚洲私人黄色宅男| 亚洲男人的天堂在线| 午夜国产精品影院在线观看| 西西裸体人体做爰大胆久久久| 欧美一级免费视频| 久久免费99精品久久久久久| 亚洲精品美女91| 亚洲美女黄色片| 亚洲素人一区二区| 欧美在线视频观看免费网站| 久久精品视频一| 欧美福利视频一区| 亚洲精品一区二区三区婷婷月 | 久久综合狠狠| 欧美激情按摩在线| 99re66热这里只有精品4| 一区二区三区欧美激情| 亚洲欧美日韩专区| 久久影音先锋| 欧美三级小说| 黄色亚洲在线| 99热这里只有精品8| 亚洲欧美欧美一区二区三区| 欧美综合国产| 亚洲福利在线看| 亚洲一区免费视频| 久久先锋资源| 欧美四级在线| 亚洲高清视频一区二区| 亚洲无亚洲人成网站77777| 久久久久国产精品一区| 亚洲欧洲精品一区二区三区波多野1战4| 日韩亚洲一区二区| 久久成人一区二区| 欧美日韩中文字幕精品| 国模精品娜娜一二三区| 宅男噜噜噜66国产日韩在线观看| 久久精品国产免费观看| 亚洲精品男同| 久久久久久香蕉网| 国产九色精品成人porny| 亚洲精品欧美极品| 久久久水蜜桃av免费网站| 一道本一区二区| 免费成人黄色片| 黑丝一区二区三区| 亚洲欧美日韩综合| 亚洲大片av| 久久久噜噜噜久噜久久|