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

天行健 君子當自強而不息

高級紋理映射技術(shù)(6)

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

 

紋理坐標自動生成

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

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

通過調(diào)用SetTextureStageState()并將第二個參數(shù)設(shè)置為D3DTSS_TEXCOORDINDEX來控制Direct3D系統(tǒng)如何自動生成紋理坐標。

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.

其中第三個參數(shù)可以設(shè)為下列列表中的成員:

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將忽略頂點中的紋理坐標,轉(zhuǎn)而使用自動生成的紋理坐標。

D3DTSS_TEXTURETRANSFORMFLAGS用來控制生成的紋理坐標的輸出,在大多數(shù)情況下紋理坐標是二維的,即將D3DTSS_TEXTURETRANSFORMFLAGS設(shè)置為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.

輸出的紋理坐標維數(shù)由枚舉類型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).

首先,我們定義頂點結(jié)構(gòu)和格式:

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

接著生成頂點數(shù)據(jù),頂點數(shù)據(jù)中沒有包含紋理坐標:

// 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);

運行效果:

若設(shè)置D3DTSS_TEXCOORDINDEX為以下D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR,則效果為:

若設(shè)置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: 高級紋理映射技術(shù)(6) 2011-07-20 10:49 王聰

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


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲激情网站| 欧美日韩亚洲一区| 久久中文精品| 久久久免费观看视频| 亚洲一区二区在| 一区二区三区产品免费精品久久75 | 亚洲国产美女| 一区二区在线视频播放| 亚洲国产精品美女| 一本色道久久综合精品竹菊 | 久久理论片午夜琪琪电影网| 久久夜色精品国产| 欧美大片一区二区三区| 亚洲国产视频一区| 亚洲香蕉成视频在线观看| 午夜精品久久| 免费看的黄色欧美网站| 欧美天堂亚洲电影院在线观看| 国产精品日韩| 影音先锋在线一区| av不卡在线看| 久久精品一区| 亚洲精品久久久蜜桃| 亚洲欧美综合网| 免费日韩一区二区| 欧美午夜www高清视频| 娇妻被交换粗又大又硬视频欧美| 99在线热播精品免费| 久久黄色影院| 亚洲精品在线免费| 久久精品国产第一区二区三区最新章节| 久久夜色精品国产欧美乱| 欧美午夜在线观看| 亚洲国产精品日韩| 久久xxxx精品视频| 99re国产精品| 欧美69视频| 国语自产精品视频在线看一大j8| 99精品99| 久久精品一区蜜桃臀影院| 国产免费亚洲高清| 欧美日韩精品免费观看| 国产精品视频导航| 99亚洲视频| 欧美大片在线观看一区| 欧美国产日韩一区二区在线观看 | 亚洲欧美成人一区二区三区| 久久激情五月激情| 亚洲国产你懂的| 久久精品国语| 亚洲国产人成综合网站| 亚洲人成在线观看| 国产精品高潮呻吟久久av无限 | 一区二区高清在线| 亚洲一区3d动漫同人无遮挡| 欧美日韩午夜在线视频| 午夜欧美大片免费观看| 久久久久九九九| 欧美一级黄色录像| 久久精品国内一区二区三区| 亚洲精品一区久久久久久| 在线观看亚洲视频啊啊啊啊| 亚洲一区二区三区久久| 亚洲性图久久| 亚洲日本中文字幕区| 一个色综合av| 亚洲精品免费网站| 国产精品久久久久7777婷婷| 在线观看精品视频| 亚洲高清在线精品| 你懂的网址国产 欧美| 日韩视频精品在线观看| 亚洲一区在线免费| 亚洲高清二区| 久久综合久久综合久久| 日韩午夜av| 欧美啪啪成人vr| 乱中年女人伦av一区二区| 美女亚洲精品| 欧美综合国产精品久久丁香| 欧美成人免费大片| 欧美r片在线| 亚洲成人影音| 欧美日韩国产不卡在线看| 最新中文字幕亚洲| 国产在线观看91精品一区| 亚洲二区在线观看| 国产免费成人| 亚洲国产天堂久久国产91| 一区二区三区我不卡| 久久久亚洲成人| 亚洲精品一区二区三区四区高清| 一本到12不卡视频在线dvd| 免费观看日韩av| 欧美激情国产日韩精品一区18| 国产欧美日本一区视频| 亚洲一区中文| 久久久亚洲精品一区二区三区| 亚洲电影第1页| 亚洲欧美欧美一区二区三区| 久久蜜桃香蕉精品一区二区三区| 激情av一区二区| 性色av一区二区三区在线观看 | 久久精品99| 亚洲欧美影音先锋| 亚洲第一页中文字幕| 欧美日韩在线一区二区| 日韩一级裸体免费视频| 亚洲视频观看| 一区二区三区自拍| 欧美激情视频免费观看| 亚洲你懂的在线视频| 亚洲国产日韩欧美一区二区三区| 欧美一区二区三区在线播放| 亚洲一区二区伦理| 在线观看视频一区二区欧美日韩| 久久国产精品电影| 日韩小视频在线观看| 免费日韩av电影| 麻豆91精品91久久久的内涵| 欧美在线播放一区二区| 午夜一区在线| 欧美一区永久视频免费观看| 日韩亚洲在线观看| 亚洲国产精品热久久| 欲色影视综合吧| 一区二区三区鲁丝不卡| 一区二区三区.www| 午夜国产不卡在线观看视频| 亚洲免费高清| 日韩视频不卡中文| 亚洲影视中文字幕| 久久精品亚洲| 亚洲激情另类| 欧美在线在线| 麻豆乱码国产一区二区三区| 久久综合国产精品| 欧美久久久久久久久| 国产精品magnet| 亚洲日本aⅴ片在线观看香蕉| 亚洲乱码国产乱码精品精 | 欧美一区高清| 亚洲欧洲久久| 久久精彩视频| 国产精品视频你懂的| 精品88久久久久88久久久| 亚洲视频你懂的| 牛人盗摄一区二区三区视频| 一区二区三区导航| 欧美久色视频| 欧美性猛交99久久久久99按摩| 国产精品国色综合久久| 欧美日韩国产精品自在自线| 欧美日韩岛国| 欧美在线高清| 国产精品久久久久久久免费软件| 国产一区91| 国产精品99久久久久久久vr | 国产亚洲一区二区三区在线观看 | 亚洲欧洲视频在线| 免费视频亚洲| 欧美伊人久久久久久午夜久久久久| 欧美本精品男人aⅴ天堂| 国产视频在线一区二区 | 亚洲电影天堂av| 久久视频在线视频| 久久综合网色—综合色88| 好看的av在线不卡观看| 美日韩在线观看| 美女图片一区二区| 亚洲午夜精品网| 欧美永久精品| 国产揄拍国内精品对白| 久久网站免费| 欧美激情精品久久久久久黑人| 国产精品综合| 欧美日韩一区三区四区| 亚洲一级二级| 久久国产精品久久久| 一区二区精品在线| 免费毛片一区二区三区久久久| 在线欧美亚洲| 亚洲精品免费在线观看| 亚洲一区二区三区中文字幕在线 | 亚洲国产毛片完整版| 亚洲激情不卡| 欧美日韩色婷婷| 男人的天堂亚洲| 欧美视频在线观看一区| 久久久久久久国产| 欧美日韩亚洲综合在线| 你懂的国产精品永久在线| 国产永久精品大片wwwapp| 欧美激情一区在线| 国产精品免费网站| 亚洲精品三级| 中文在线不卡| 欧美激情91| 亚洲国产精品激情在线观看| 激情六月婷婷久久|