日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

DirectX11 With Windows SDK--01 DirectX11初始化

發布時間:2025/3/20 windows 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DirectX11 With Windows SDK--01 DirectX11初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DirectX11 With Windows SDK--01 DirectX11初始化 原文:DirectX11 With Windows SDK--01 DirectX11初始化

前言

由于個人覺得龍書里面第4章提供的Direct3D 初始化項目封裝得比較好,而且DirectX SDK Samples里面的初始化程序過于精簡,不適合后續使用,故選擇了以Init Direct3D項目作為框架,然后還使用了微軟提供的示例項目,兩者結合到一起。建議下載項目配合閱讀。

這一章內容大部分屬于龍書的內容,但仍有一些不同的地方。因為后續的所有項目都使用該基礎框架,你也可以直接使用第一章的項目源碼,然后需要了解以下差異部分:

  • ComPtr智能指針
  • 新的HR宏
  • D3D11.1設備的創建
  • 其中前面兩個部分在下面的鏈接可以看到:

    章節
    ComPtr智能指針
    HR宏關于dxerr庫的替代方案

    DirectX11 With Windows SDK完整目錄

    Github項目源碼

    歡迎加入QQ群: 727623616 可以一起探討DX11,以及有什么問題也可以在這里匯報。

    如何開啟新項目

    安裝準備

    如果你打算從VS2015開始,則在安裝的時候需要勾選下列選項:

    編程語言那一項會自動被勾選。

    而如果是使用VS2017或19的話,則在安裝的時候需要勾選下列選項:

    注意:VS2015使用的Windows SDK版本為10.0.14393.0,而VS2017與VS2019使用的Windows SDK版本為10.0.17763.0

    安裝完成后,新建項目需要從空項目開始。

    移除你的項目中有關DX SDK的庫路徑和包含路徑

    如果你曾經用過DX SDK來編寫DX項目,務必要把你之前配置的DX SDK庫路徑和包含路徑給清理掉,使用項目默認的庫路徑和包含路徑!

    鏈接靜態庫

    這里的每一個項目都需要包含靜態庫:d3d11.lib,dxgi.lib,dxguid.lib,D3DCompiler.lib和winmm.lib。可以在d3dApp.h添加下面的語句:

    #pragma comment(lib, "d3d11.lib") #pragma comment(lib, "dxgi.lib") #pragma comment(lib, "dxguid.lib") #pragma comment(lib, "D3DCompiler.lib") #pragma comment(lib, "winmm.lib")

    也可以在項目屬性-鏈接器-輸入-附加依賴項 添加上面的庫。

    字符集設置為Unicode

    在項目屬性頁中可以直接進行修改。

    Win7系統下的額外配置

    由于Win10 SDK中的某些函數在Win7是不支持的,我們還需要在屬性頁-配置屬性-C/C++ -預處理器中,添加預處理器定義以限制API集合:_WIN32_WINNT=0x601

    現在最基本的配置已經完成,你可以嘗試將本教程用到的項目01中所有的頭文件和源文件添加進你的項目,然后生成項目并運行以檢測。

    項目結構

    現在把目光拉回到我們的教程項目。目前項目中包含頭文件的具體功能如下:

    頭文件功能
    d3dApp.hDirect3D應用程序框架類
    d3dUtil.h包含一些常用頭文件及自己編寫的函數
    DXTrace.h包含了HR宏與DXTraceW函數
    GameApp.h游戲應用程序擴展類,游戲邏輯在這里實現,繼承自D3DApp類
    GameTimer.h游戲計時器類

    其中d3dApp類和GameTimer類是龍書源碼提供的,我們可以搬運過來,但是對d3dApp框架類我們還需要進行大幅度修改,畢竟我們的最終目的就是要完全脫離舊的DirectX SDK,使用Windows SDK來實現DX11。修改完成后,d3dApp就幾乎已經定型而不需要我們操心了。

    GameApp類則是我們編寫游戲邏輯的地方,這里需要進行逐幀的更新及繪制。

    D3DApp框架類

    D3DApp.h展示了框架類的聲明,這里的接口類指針全部換上了ComPtr智能指針:

    class D3DApp { public:D3DApp(HINSTANCE hInstance); // 在構造函數的初始化列表應當設置好初始參數virtual ~D3DApp();HINSTANCE AppInst()const; // 獲取應用實例的句柄HWND MainWnd()const; // 獲取主窗口句柄float AspectRatio()const; // 獲取屏幕寬高比int Run(); // 運行程序,進行游戲主循環// 框架方法。客戶派生類需要重載這些方法以實現特定的應用需求virtual bool Init(); // 該父類方法需要初始化窗口和Direct3D部分virtual void OnResize(); // 該父類方法需要在窗口大小變動的時候調用virtual void UpdateScene(float dt) = 0; // 子類需要實現該方法,完成每一幀的更新virtual void DrawScene() = 0; // 子類需要實現該方法,完成每一幀的繪制virtual LRESULT MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);// 窗口的消息回調函數 protected:bool InitMainWindow(); // 窗口初始化bool InitDirect3D(); // Direct3D初始化void CalculateFrameStats(); // 計算每秒幀數并在窗口顯示protected:HINSTANCE m_hAppInst; // 應用實例句柄HWND m_hMainWnd; // 主窗口句柄bool m_AppPaused; // 應用是否暫停bool m_Minimized; // 應用是否最小化bool m_Maximized; // 應用是否最大化bool m_Resizing; // 窗口大小是否變化bool m_Enable4xMsaa; // 是否開啟4倍多重采樣UINT m_4xMsaaQuality; // MSAA支持的質量等級GameTimer m_Timer; // 計時器// 使用模板別名(C++11)簡化類型名template <class T>using ComPtr = Microsoft::WRL::ComPtr<T>;// Direct3D 11ComPtr<ID3D11Device> m_pd3dDevice; // D3D11設備ComPtr<ID3D11DeviceContext> m_pd3dImmediateContext; // D3D11設備上下文ComPtr<IDXGISwapChain> m_pSwapChain; // D3D11交換鏈// Direct3D 11.1ComPtr<ID3D11Device1> m_pd3dDevice1; // D3D11.1設備ComPtr<ID3D11DeviceContext1> m_pd3dImmediateContext1; // D3D11.1設備上下文ComPtr<IDXGISwapChain1> m_pSwapChain1; // D3D11.1交換鏈// 常用資源ComPtr<ID3D11Texture2D> m_pDepthStencilBuffer; // 深度模板緩沖區ComPtr<ID3D11RenderTargetView> m_pRenderTargetView; // 渲染目標視圖ComPtr<ID3D11DepthStencilView> m_pDepthStencilView; // 深度模板視圖D3D11_VIEWPORT m_ScreenViewport; // 視口// 派生類應該在構造函數設置好這些自定義的初始參數std::wstring m_MainWndCaption; // 主窗口標題int m_ClientWidth; // 視口寬度int m_ClientHeight; // 視口高度 };

    而在d3dApp.cpp中,可以看到有一個全局變量g_pd3dApp:

    namespace {// This is just used to forward Windows messages from a global window// procedure to our member function window procedure because we cannot// assign a member function to WNDCLASS::lpfnWndProc.D3DApp* g_pd3dApp = 0; }

    設置該全局變量是因為在窗口創建的時候需要綁定一個回調函數,受到回調函數指針類型的限制,我們不可以綁定d3dApp::MainWndProc的成員方法,所以還需要實現一個全局函數用于回調函數的綁定:

    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {// Forward hwnd on because we can get messages (e.g., WM_CREATE)// before CreateWindow returns, and thus before m_hMainWnd is valid.return g_pd3dApp->MsgProc(hwnd, msg, wParam, lParam); }

    D3DApp::InitWindow和D3DApp::MsgProc方法目前在這里不做過多描述,因為這不是教程的重點部分,但后續可能還要回頭修改這兩個方法。有興趣的可以去MSDN查閱這些函數和結構體的信息。

    Direct3D初始化

    注意當前項目使用的是d3d11_1.h頭文件

    Direct3D初始化階段首先需要創建D3D設備D3D設備上下文

    D3D設備(ID3D11Device)包含了創建各種所需資源的方法,最常用的有:資源類(ID3D11Resource, 包含紋理和緩沖區)視圖類以及著色器

    D3D設備上下文(ID3D11DeviceContext)可以看做是一個渲染管線,負責渲染工作,它需要綁定來自D3D設備創建的各種資源、視圖和著色器才能正常運轉,除此之外,它還能夠負責對資源的直接讀寫操作。

    而如果支持Direct3D 11.1的話,則對應的接口類為:ID3D11Device1、ID3D11DeviceContext1,它們分別繼承自上面的兩個接口類,區別在于額外提供了少數新的接口,并且接口方法的實現可能會有所區別。

    現在,我們從D3DApp::InitDirect3D方法開始,一步步進行分析。

    D3D設備與D3D設備上下文的創建

    D3D11CreateDevice函數--創建D3D設備與D3D設備上下文

    創建D3D設備、D3D設備上下文使用如下函數:

    HRESULT WINAPI D3D11CreateDevice(IDXGIAdapter* pAdapter, // [In_Opt]適配器D3D_DRIVER_TYPE DriverType, // [In]驅動類型HMODULE Software, // [In_Opt]若上面為D3D_DRIVER_TYPE_SOFTWARE則這里需要提供程序模塊UINT Flags, // [In]使用D3D11_CREATE_DEVICE_FLAG枚舉類型D3D_FEATURE_LEVEL* pFeatureLevels, // [In_Opt]若為nullptr則為默認特性等級,否則需要提供特性等級數組UINT FeatureLevels, // [In]特性等級數組的元素數目UINT SDKVersion, // [In]SDK版本,默認D3D11_SDK_VERSIONID3D11Device** ppDevice, // [Out_Opt]輸出D3D設備D3D_FEATURE_LEVEL* pFeatureLevel, // [Out_Opt]輸出當前應用D3D特性等級ID3D11DeviceContext** ppImmediateContext ); //[Out_Opt]輸出D3D設備上下文
  • 關于pAdapter(適配器),我們可以將它看做是對顯示卡設備的一層封裝,通過該參數,我們可以指定需要使用哪個顯示卡設備。通常該參數我們設為nullptr,這樣就可以交由上層驅動來幫我們決定使用哪個顯卡,或者在NVIDIA控制面板來設置當前程序要使用哪個顯卡。如果想要在應用層決定,使用IDXGIFactory::EnumAdapters方法可以枚舉當前可用的顯示卡設備。在最底下的練習題你將學會如何指定顯示卡設備來創建Direct3D 11.x設備。
  • DriverType則指定了驅動類型,不過通常大多數情況都會支持D3D_DRIVER_TYPE_HARDWARE,以享受硬件加速帶來的效益。現在我們建立一個驅動數組,然后自己通過for循環的方式進行輪詢:
  • // 驅動類型數組 D3D_DRIVER_TYPE driverTypes[] = {D3D_DRIVER_TYPE_HARDWARE, // 硬件驅動D3D_DRIVER_TYPE_WARP, // WARP驅動D3D_DRIVER_TYPE_REFERENCE, // 軟件驅動 }; UINT numDriverTypes = ARRAYSIZE(driverTypes);

    如果D3D_DRIVER_TYPE_HARDWARE不支持,則需要自己通過循環的形式再檢查D3D_DRIVER_TYPE_WARP是否支持。

    關于D3D_DRIVER_TYPE的詳細描述,可以去查閱MSDN官方文檔詳細了解一下。

  • Flags對應的是D3D11_CREATE_DEVICE_FLAG枚舉值,如果需要D3D設備調試的話(在Debug模式下),可以指定D3D11_CREATE_DEVICE_DEBUG枚舉值。指定該值后,可以在出現程序異常的時候觀察調試輸出窗口的信息。
  • pFeatureLevels是一個特性等級數組,通過函數內部進行輪詢以檢測所支持的特性等級:
  • // 特性等級數組 D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0, }; UINT numFeatureLevels = ARRAYSIZE(featureLevels);

    注意:如果你的系統支持Direct3D 11.1的API,卻把pFeatureLevels設置為nullptr,D3D11CreateDevice將創建出特性等級為D3D_FEATURE_LEVEL_11_0的設備。而如果你的系統不支持Direct3D 11.1的API,D3D11CreateDevice會立即停止特性數組的輪詢并返回E_INVALIDARG。為此,你必須要從D3D_FEATURE_LEVEL_11_0或更低特性等級開始輪詢。

    在Win10, Win8.x 或 Win7 SP1且安裝了KB2670838補丁的系統都支持Direct3D 11.1的API,而純Win7系統僅支持Direct3D 11的API

    從上面的描述我們可以得知,特性等級D3D設備的版本并不是互相對應的:

    1. 特性等級的支持情況取決于當前使用的顯示適配器

    2. D3D設備的版本取決于所處的系統

    由于該函數可以創建Direct3D 11.1(或者Direct3D 11.0)的設備與設備上下文,但都統一輸出ID3D11Device和ID3D11DeviceContext。如果想要查看是否支持Direct3D 11.1的API,可以使用下面的方式:

    ComPtr<ID3D11Device1> md3dDevice1; HRESULT hr = md3dDevice.As(&md3dDevice1);

    同理,想要查看是否支持Direct3D 11.2的API,則可以這樣:

    ComPtr<ID3D11Device2> md3dDevice2; HRESULT hr = md3dDevice.As(&md3dDevice2);

    由于每個電腦的顯示卡設備情況有所差異,該教程采用的是默認顯示卡(有可能會用到集成顯卡),而不是指定顯示卡:

    HRESULT hr = S_OK;// 創建D3D設備 和 D3D設備上下文 UINT createDeviceFlags = 0; #if defined(DEBUG) || defined(_DEBUG) createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif // 驅動類型數組 D3D_DRIVER_TYPE driverTypes[] = {D3D_DRIVER_TYPE_HARDWARE,D3D_DRIVER_TYPE_WARP,D3D_DRIVER_TYPE_REFERENCE, }; UINT numDriverTypes = ARRAYSIZE(driverTypes);// 特性等級數組 D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0, }; UINT numFeatureLevels = ARRAYSIZE(featureLevels);D3D_FEATURE_LEVEL featureLevel; D3D_DRIVER_TYPE d3dDriverType; for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) {d3dDriverType = driverTypes[driverTypeIndex];hr = D3D11CreateDevice(nullptr, d3dDriverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,D3D11_SDK_VERSION, m_pd3dDevice.GetAddressOf(), &featureLevel, m_pd3dImmediateContext.GetAddressOf());if (hr == E_INVALIDARG){// Direct3D 11.0 的API不承認D3D_FEATURE_LEVEL_11_1,所以我們需要嘗試特性等級11.0以及以下的版本hr = D3D11CreateDevice(nullptr, d3dDriverType, nullptr, createDeviceFlags, &featureLevels[1], numFeatureLevels - 1,D3D11_SDK_VERSION, m_pd3dDevice.GetAddressOf(), &featureLevel, m_pd3dImmediateContext.GetAddressOf());}if (SUCCEEDED(hr))break; }if (FAILED(hr)) {MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);return false; }// 檢測是否支持特性等級11.0或11.1 if (featureLevel != D3D_FEATURE_LEVEL_11_0 && featureLevel != D3D_FEATURE_LEVEL_11_1) {MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0);return false; }// 檢測 MSAA支持的質量等級 md3dDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, 4, &m_4xMsaaQuality); assert(m_4xMsaaQuality > 0);

    注意:

  • 支持特性等級11_0的顯示適配器必然支持所有渲染目標紋理格式的4倍多重采樣
  • 即便m_4xMsaaQuality的返回值為1,也不代表沒法啟動4倍多重采樣,該成員只是代表模式的種類數目
  • DXGI初始化

    DXGI交換鏈

    DXGI交換鏈(IDXGISwapChain)緩存了一個或多個表面(2D紋理),它們都可以稱作后備緩沖區(backbuffer)。后備緩沖區則是我們主要進行渲染的場所,我們可以將這些緩沖區通過合適的手段成為渲染管線的輸出對象。在進行呈現(Present)的時候有兩種方法:

  • BitBlt Model(位塊傳輸模型):將后備緩沖區的數據進行BitBlt(位塊傳輸),傳入到DX應用中的桌面窗口管理器(DWM)表面,然后進行翻轉以交給前臺顯示。使用這種模型至少需要一個后備緩沖區。事實上,這也是Win32應用程序最常使用的方式,在進行呈現后,渲染管線仍然是對同一個后備緩沖區進行輸出。(支持Windows 7及更高版本)
  • Flip Model(翻轉模型):該模型可以避免上一種方式多余的復制,后備緩沖區表面可以直接與桌面窗口管理器(DWM)內的表面進行翻轉。但是需要創建至少兩個后備緩沖區,并且在每次完成呈現后切換到另一個后備緩沖區進行渲染。該模型可以用于Win32應用程序以及UWP應用程序(需要DXGI1.2,支持Windows 8及更高版本)
  • 注意:考慮到要兼容Win7系統,而且由于我們編寫的是Win32應用程序,因此這里使用的是第一種模型。同時這也是絕大多數教程所使用的。對第二種感興趣的可以了解下面的鏈接:

    DXGI翻轉模型

    接下來我們需要了解D3D與DXGI各版本的對應關系,這十分重要:

    Direct3D API支持版本對應包含DXGI版本對應DXGI接口可枚舉的顯示適配器可創建的交換鏈
    Direct3D 11.1DXGI 1.2IDXGIFactory2IDXGIAdaptor2IDXGISwapChain1
    Direct3D 11.0/10.1DXGI 1.1IDXGIFactory1IDXGIAdaptor1IDXGISwapChain
    Direct3D 10.0DXGI 1.0IDXGIFactoryIDXGIAdaptorIDXGISwapChain

    d3d與dxgi版本的對應關系你可以通過觀察這些d3d頭文件所包含的dxgi頭文件來了解。

    DXGI交換鏈的創建需要通過IDXGIFactory::CreateSwapChain方法進行。但是,如果是要創建Direct3D 11.1對應的交換鏈,則需要通過IDXGIFactory2::CreateSwapChainForHwnd方法進行。

    獲取IDXGIFactory1或IDXGIFactory2接口類

    現在我們需要先拿到包含IDXGIFactory1接口的對象,但是為了拿到該對象還需要經歷一些磨難。

    之前在創建D3D設備時使用的是默認的顯卡適配器IDXGIAdapter(對于雙顯卡的筆記本大概率使用的是集成顯卡),而創建出來的D3D設備本身實現了IDXGIDevice接口,通過該對象,我們可以獲取到當前所用的顯卡適配器IDXGIAdapter對象,這樣我們再通過查詢它的父級找到是哪個IDXGIFactory枚舉出來的適配器。

    ComPtr<IDXGIDevice> dxgiDevice = nullptr; ComPtr<IDXGIAdapter> dxgiAdapter = nullptr; ComPtr<IDXGIFactory1> dxgiFactory1 = nullptr; // D3D11.0(包含DXGI1.1)的接口類 ComPtr<IDXGIFactory2> dxgiFactory2 = nullptr; // D3D11.1(包含DXGI1.2)特有的接口類// 為了正確創建 DXGI交換鏈,首先我們需要獲取創建 D3D設備 的 DXGI工廠,否則會引發報錯: // "IDXGIFactory::CreateSwapChain: This function is being called with a device from a different IDXGIFactory." HR(m_pd3dDevice.As(&dxgiDevice)); HR(dxgiDevice->GetAdapter(dxgiAdapter.GetAddressOf())); HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory1), reinterpret_cast<void**>(dxgiFactory1.GetAddressOf())));// 查看該對象是否包含IDXGIFactory2接口 hr = dxgiFactory1.As(&dxgiFactory2); // 如果包含,則說明支持D3D11.1 if (dxgiFactory2 != nullptr) {HR(m_pd3dDevice.As(&m_pd3dDevice1));HR(m_pd3dImmediateContext.As(&m_pd3dImmediateContext1));// ... 省略交換鏈IDXGISwapChain1的創建 } else {// ... 省略交換鏈IDXGISwapChain的創建 }

    同時之前也提到,如果支持Direct3D 11.1的話,我們就可以拿到DXGI 1.2的相關對象(如IDXGIFactory2)。

    這時m_pd3dDevice和m_pd3dDevice1其實都指向同一個對象,m_pd3dImmediateContext和m_pd3dImmediateContext1,m_pSwapChain和m_pSwapChain1也是一樣的,區別僅僅在于后者實現了額外的一些接口,問題不大。因此不管是Direct3D 11.1還是Direct3D 11.0,后續都主要使用m_pd3dDevice,m_pd3dImmediateContext和m_pSwapChain來進行操作。

    IDXGIFactory2::CreateSwapChainForHwnd方法--Direct3D 11.1創建交換鏈

    如果是Direct3D 11.1的話,需要先填充DXGI_SWAP_CHAIN_DESC1和DXGI_SWAP_CHAIN_FULLSCREEN_DESC這兩個結構體:

    typedef struct DXGI_SWAP_CHAIN_DESC1 {UINT Width; // 緩沖區寬度UINT Height; // 緩沖區高度DXGI_FORMAT Format; // 緩沖區數據格式BOOL Stereo; // 忽略 DXGI_SAMPLE_DESC SampleDesc; // 采樣描述DXGI_USAGE BufferUsage; // 緩沖區用途UINT BufferCount; // 緩沖區數目DXGI_SCALING Scaling; // 忽略DXGI_SWAP_EFFECT SwapEffect; // 交換效果DXGI_ALPHA_MODE AlphaMode; // 忽略UINT Flags; // 使用DXGI_SWAP_CHAIN_FLAG枚舉類型 } DXGI_SWAP_CHAIN_DESC1;typedef struct DXGI_SAMPLE_DESC {UINT Count; // MSAA采樣數UINT Quality; // MSAA質量等級 } DXGI_SAMPLE_DESC;typedef struct DXGI_SWAP_CHAIN_FULLSCREEN_DESC {DXGI_RATIONAL RefreshRate; // 刷新率DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; // 忽略DXGI_MODE_SCALING Scaling; // 忽略BOOL Windowed; // 是否窗口化 } DXGI_SWAP_CHAIN_FULLSCREEN_DESC;typedef struct DXGI_RATIONAL {UINT Numerator; // 刷新率分子UINT Denominator; // 刷新率分母 } DXGI_RATIONAL;

    填充好后,Direct3D 11.1使用的創建方法為IDXGIFactory2::CreateSwapChainForHwnd:

    HRESULT IDXGIFactory2::CreateSwapChainForHwnd(IUnknown *pDevice, // [In]D3D設備HWND hWnd, // [In]窗口句柄const DXGI_SWAP_CHAIN_DESC1 *pDesc, // [In]交換鏈描述1const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc, // [In]交換鏈全屏描述,可選IDXGIOutput *pRestrictToOutput, // [In]忽略IDXGISwapChain1 **ppSwapChain); // [Out]輸出交換鏈對象

    上面第一個省略的部分代碼如下:

    // 填充各種結構體用以描述交換鏈 DXGI_SWAP_CHAIN_DESC1 sd; ZeroMemory(&sd, sizeof(sd)); sd.Width = m_ClientWidth; sd.Height = m_ClientHeight; sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 是否開啟4倍多重采樣? if (m_Enable4xMsaa) {sd.SampleDesc.Count = 4;sd.SampleDesc.Quality = m_4xMsaaQuality - 1; } else {sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0; } sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferCount = 1; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; sd.Flags = 0;DXGI_SWAP_CHAIN_FULLSCREEN_DESC fd; fd.RefreshRate.Numerator = 60; fd.RefreshRate.Denominator = 1; fd.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; fd.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; fd.Windowed = TRUE; // 為當前窗口創建交換鏈 HR(dxgiFactory2->CreateSwapChainForHwnd(m_pd3dDevice.Get(), m_hMainWnd, &sd, &fd, nullptr, m_pSwapChain1.GetAddressOf())); HR(m_pSwapChain1.As(&m_pSwapChain));

    后續我們還可以通過該交換鏈來手動指定是否需要全屏

    IDXGIFactory::CreateSwapChain方法--Direct3D 11創建交換鏈

    如果是Direct3D 11.0的話,需要先填充DXGI_SWAP_CHAIN_DESC結構體:

    typedef struct DXGI_SWAP_CHAIN_DESC {DXGI_MODE_DESC BufferDesc; // 緩沖區描述DXGI_SAMPLE_DESC SampleDesc; // 采樣描述DXGI_USAGE BufferUsage; // 緩沖區用途UINT BufferCount; // 后備緩沖區數目HWND OutputWindow; // 輸出窗口句柄BOOL Windowed; // 窗口化?DXGI_SWAP_EFFECT SwapEffect; // 交換效果UINT Flags; // 使用DXGI_SWAP_CHAIN_FLAG枚舉類型 } DXGI_SWAP_CHAIN_DESC;typedef struct DXGI_SAMPLE_DESC {UINT Count; // MSAA采樣數UINT Quality; // MSAA質量等級 } DXGI_SAMPLE_DESC;typedef struct DXGI_MODE_DESC {UINT Width; // 緩沖區寬度UINT Height; // 緩沖區高度DXGI_RATIONAL RefreshRate; // 刷新率分數表示法DXGI_FORMAT Format; // 緩沖區數據格式DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; // 忽略DXGI_MODE_SCALING Scaling; // 忽略 } DXGI_MODE_DESC;typedef struct DXGI_RATIONAL {UINT Numerator; // 刷新率分子UINT Denominator; // 刷新率分母 } DXGI_RATIONAL;

    Direct3D 11.0下使用的創建方法為IDXGIFactory::CreateSwapChain:

    HRESULT IDXGIFactory::CreateSwapChain(IUnknown *pDevice, // [In]D3D設備DXGI_SWAP_CHAIN_DESC *pDesc, // [In]交換鏈描述IDXGISwapChain **ppSwapChain); // [Out]輸出交換鏈對象

    第二個省略的部分代碼如下:

    // 填充DXGI_SWAP_CHAIN_DESC用以描述交換鏈 DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferDesc.Width = m_ClientWidth; sd.BufferDesc.Height = m_ClientHeight; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; // 是否開啟4倍多重采樣? if (m_Enable4xMsaa) {sd.SampleDesc.Count = 4;sd.SampleDesc.Quality = m_4xMsaaQuality - 1; } else {sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0; } sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferCount = 1; sd.OutputWindow = m_hMainWnd; sd.Windowed = TRUE; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; sd.Flags = 0; HR(dxgiFactory1->CreateSwapChain(m_pd3dDevice.Get(), &sd, m_pSwapChain.GetAddressOf()));

    禁用ALT+ENTER與全屏的關聯

    默認情況下按ALT+ENTER可以切換成全屏,如果不想要這種操作,可以使用剛才創建的dxgiFactory1,按照下面的方式來調用即可:

    dxgiFactory1->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER | DXGI_MWA_NO_WINDOW_CHANGES);

    這樣DXGI就不會監聽Windows消息隊列,并且屏蔽掉了對接收到ALT+ENTER消息的處理。

    DXGI交換鏈與Direct3D設備的交互

    在創建好上述對象后,如果窗口的大小是固定的,則需要經歷下面的步驟:

  • 獲取交換鏈后備緩沖區的ID3D11Texture2D接口對象
  • 為后備緩沖區創建渲染目標視圖ID3D11RenderTargetView
  • 通過D3D設備創建一個ID3D11Texture2D用作深度/模板緩沖區,要求與后備緩沖區等寬高
  • 創建深度/模板視圖ID3D11DepthStrenilView,綁定剛才創建的2D紋理
  • 通過D3D設備上下文,在渲染管線的輸出合并階段設置渲染目標
  • 在渲染管線的光柵化階段設置好渲染的視口區域
  • 接下來需要快速了解一遍上述步驟所需要用到的API。

    獲取交換鏈的后備緩沖區

    由于此前我們創建好的交換鏈已經包含1個后備緩沖區了,我們可以通過IDXGISwapChain::GetBuffer方法直接獲取后備緩沖區的ID3D11Texture2D接口:

    HRESULT IDXGISwapChain::GetBuffer( UINT Buffer, // [In]緩沖區索引號,從0到BufferCount - 1REFIID riid, // [In]緩沖區的接口類型IDvoid **ppSurface); // [Out]獲取到的緩沖區

    為后備緩沖區創建渲染目標視圖

    渲染目標視圖用于將渲染管線的運行結果輸出給其綁定的資源,很明顯它也只能夠設置給輸出合并階段。渲染目標視圖要求其綁定的資源是允許GPU讀寫的,因為在作為管線輸出時會通過GPU寫入數據,并且在以后進行混合操作時還需要在GPU讀取該資源。通常渲染目標是一個二維的紋理,但它依舊可能會綁定其余類型的資源。這里不做討論。

    現在我們需要將后備緩沖區綁定到渲染目標視圖,使用ID3D11Device::CreateRenderTargetView方法來創建:

    HRESULT ID3D11Device::CreateRenderTargetView( ID3D11Resource *pResource, // [In]待綁定到渲染目標視圖的資源const D3D11_RENDER_TARGET_VIEW_DESC *pDesc, // [In]忽略ID3D11RenderTargetView **ppRTView); // [Out]獲取渲染目標視圖

    現在這里演示了獲取后備緩沖區紋理,并綁定到渲染目標視圖的過程:

    // 重設交換鏈并且重新創建渲染目標視圖 ComPtr<ID3D11Texture2D> backBuffer; HR(m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(backBuffer.GetAddressOf()))); HR(m_pd3dDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, m_pRenderTargetView.GetAddressOf()));

    創建深度/模板緩沖區

    ID3D11Device::CreateTexture2D--創建一個2D紋理

    除了渲染目標視圖外,我們還需要創建深度/模板緩沖區用于深度測試。深度/模板緩沖區也是一個2D紋理,要求其寬度和高度必須要和窗口寬高保持一致。

    通過D3D設備可以新建一個2D紋理,但在此之前我們需要先描述該緩沖區的信息:

    typedef struct D3D11_TEXTURE2D_DESC {UINT Width; // 緩沖區寬度UINT Height; // 緩沖區高度UINT MipLevels; // Mip等級UINT ArraySize; // 紋理數組中的紋理數量,默認1DXGI_FORMAT Format; // 緩沖區數據格式DXGI_SAMPLE_DESC SampleDesc; // MSAA采樣描述D3D11_USAGE Usage; // 數據的CPU/GPU訪問權限UINT BindFlags; // 使用D3D11_BIND_FLAG枚舉來決定該數據的使用類型UINT CPUAccessFlags; // 使用D3D11_CPU_ACCESS_FLAG枚舉來決定CPU訪問權限UINT MiscFlags; // 使用D3D11_RESOURCE_MISC_FLAG枚舉,這里默認0 } D3D11_TEXTURE2D_DESC;

    由于要填充的內容很多,并且目前只有在初始化環節才用到,因此這部分代碼可以先粗略看一下,在后續的章節還會詳細講到。

    填充好后,這時我們就可以用方法ID3D11Device::CreateTexture2D來創建2D紋理:

    HRESULT ID3D11Device::CreateTexture2D( const D3D11_TEXTURE2D_DESC *pDesc, // [In] 2D紋理描述信息const D3D11_SUBRESOURCE_DATA *pInitialData, // [In] 用于初始化的資源ID3D11Texture2D **ppTexture2D); // [Out] 獲取到的2D紋理

    下面的代碼是關于深度/模板緩沖區創建的完整過程:

    D3D11_TEXTURE2D_DESC depthStencilDesc;depthStencilDesc.Width = mClientWidth; depthStencilDesc.Height = mClientHeight; depthStencilDesc.MipLevels = 1; depthStencilDesc.ArraySize = 1; depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;// 要使用 4X MSAA? if (mEnable4xMsaa) {depthStencilDesc.SampleDesc.Count = 4;depthStencilDesc.SampleDesc.Quality = m_4xMsaaQuality - 1; } else {depthStencilDesc.SampleDesc.Count = 1;depthStencilDesc.SampleDesc.Quality = 0; }depthStencilDesc.Usage = D3D11_USAGE_DEFAULT; depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthStencilDesc.CPUAccessFlags = 0; depthStencilDesc.MiscFlags = 0;HR(m_pd3dDevice->CreateTexture2D(&depthStencilDesc, nullptr, m_pDepthStencilBuffer.GetAddressOf()));

    創建深度/模板視圖

    有了深度/模板緩沖區后,就可以通過ID3D11Device::CreateDepthStencilView方法將創建好的2D紋理綁定到新建的深度/模板視圖:

    HRESULT ID3D11Device::CreateDepthStencilView( ID3D11Resource *pResource, // [In] 需要綁定的資源const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc, // [In] 深度緩沖區描述,這里忽略ID3D11DepthStencilView **ppDepthStencilView); // [Out] 獲取到的深度/模板視圖

    演示如下:

    HR(m_pd3dDevice->CreateDepthStencilView(m_pDepthStencilBuffer.Get(), nullptr, m_pDepthStencilView.GetAddressOf()));

    為渲染管線的輸出合并階段設置渲染目標

    ID3D11DeviceContext::OMSetRenderTargets方法要求同時提供渲染目標視圖和深度/模板視圖,不過這時我們都已經準備好了:

    void ID3D11DeviceContext::OMSetRenderTargets( UINT NumViews, // [In] 視圖數目ID3D11RenderTargetView *const *ppRenderTargetViews, // [In] 渲染目標視圖數組ID3D11DepthStencilView *pDepthStencilView) = 0; // [In] 深度/模板視圖

    因此這里同樣也是一句話的事情:

    m_pd3dImmediateContext->OMSetRenderTargets(1, m_pRenderTargetView.GetAddressOf(), m_pDepthStencilView.Get());

    視口設置

    最終我們還需要決定將整個視圖輸出到窗口特定的范圍。我們需要使用D3D11_VIEWPORT來設置視口

    typedef struct D3D11_VIEWPORT {FLOAT TopLeftX; // 屏幕左上角起始位置XFLOAT TopLeftY; // 屏幕左上角起始位置YFLOAT Width; // 寬度FLOAT Height; // 高度FLOAT MinDepth; // 最小深度,必須為0.0fFLOAT MaxDepth; // 最大深度,必須為1.0f } D3D11_VIEWPORT;

    ID3D11DeviceContext::RSSetViewports方法將設置1個或多個視口:

    void ID3D11DeviceContext::RSSetViewports(UINT NumViewports, // 視口數目const D3D11_VIEWPORT *pViewports); // 視口數組

    將視圖輸出到整個屏幕需要按下面的方式進行填充:

    m_ScreenViewport.TopLeftX = 0; m_ScreenViewport.TopLeftY = 0; m_ScreenViewport.Width = static_cast<float>(mClientWidth); m_ScreenViewport.Height = static_cast<float>(mClientHeight); m_ScreenViewport.MinDepth = 0.0f; m_ScreenViewport.MaxDepth = 1.0f;m_pd3dImmediateContext->RSSetViewports(1, &m_ScreenViewport);

    完成了這六個步驟后,基本的初始化就完成了。但是,如果涉及到窗口大小變化的情況,那么前面提到的后備緩沖區、深度/模板緩沖區、視口都需要重新調整大小。

    D3DApp::OnResize方法

    已知深度模板緩沖區和視口都可以直接重新創建一份來進行替換。至于后備緩沖區,我們可以通過IDXGISwapChain::ResizeBuffers來重新調整后備緩沖區的大小:

    HRESULT IDXGISwapChain::ResizeBuffers(UINT BufferCount, // [In]緩沖區數目UINT Width, // [In]緩沖區寬度UINT Height, // [In]緩沖區高度DXGI_FORMAT NewFormat, // [In]DXGI格式UINT SwapChainFlags // [In]忽略 );

    下面的方法演示了在窗口大小發生改變后,以及初次調用時進行的操作:

    void D3DApp::OnResize() {assert(m_pd3dImmediateContext);assert(m_pd3dDevice);assert(m_pSwapChain);if (m_pd3dDevice1 != nullptr){assert(m_pd3dImmediateContext1);assert(m_pd3dDevice1);assert(m_pSwapChain1);}// 釋放交換鏈的相關資源m_pRenderTargetView.Reset();m_pDepthStencilView.Reset();m_pDepthStencilBuffer.Reset();// 重設交換鏈并且重新創建渲染目標視圖ComPtr<ID3D11Texture2D> backBuffer;HR(m_pSwapChain->ResizeBuffers(1, m_ClientWidth, m_ClientHeight, DXGI_FORMAT_R8G8B8A8_UNORM, 0));HR(m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(backBuffer.GetAddressOf())));HR(m_pd3dDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, m_pRenderTargetView.GetAddressOf()));backBuffer.Reset();D3D11_TEXTURE2D_DESC depthStencilDesc;depthStencilDesc.Width = m_ClientWidth;depthStencilDesc.Height = m_ClientHeight;depthStencilDesc.MipLevels = 1;depthStencilDesc.ArraySize = 1;depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;// 要使用 4X MSAA? --需要給交換鏈設置MASS參數if (m_Enable4xMsaa){depthStencilDesc.SampleDesc.Count = 4;depthStencilDesc.SampleDesc.Quality = m_4xMsaaQuality - 1;}else{depthStencilDesc.SampleDesc.Count = 1;depthStencilDesc.SampleDesc.Quality = 0;}depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;depthStencilDesc.CPUAccessFlags = 0;depthStencilDesc.MiscFlags = 0;// 創建深度緩沖區以及深度模板視圖HR(m_pd3dDevice->CreateTexture2D(&depthStencilDesc, nullptr, m_pDepthStencilBuffer.GetAddressOf()));HR(m_pd3dDevice->CreateDepthStencilView(m_pDepthStencilBuffer.Get(), nullptr, m_pDepthStencilView.GetAddressOf()));// 將渲染目標視圖和深度/模板緩沖區結合到管線m_pd3dImmediateContext->OMSetRenderTargets(1, m_pRenderTargetView.GetAddressOf(), m_pDepthStencilView.Get());// 設置視口變換m_ScreenViewport.TopLeftX = 0;m_ScreenViewport.TopLeftY = 0;m_ScreenViewport.Width = static_cast<float>(m_ClientWidth);m_ScreenViewport.Height = static_cast<float>(m_ClientHeight);m_ScreenViewport.MinDepth = 0.0f;m_ScreenViewport.MaxDepth = 1.0f;m_pd3dImmediateContext->RSSetViewports(1, &m_ScreenViewport); }

    在后續的部分,該框架的代碼基本上不會有什么太大的變動。因此后續代碼的添加主要在GameApp類實現。如果現在對上面的一些過程不理解,也是正常的,可以在后續學習到視圖相關的知識后再來回看這一整個過程。

    GameApp類

    對于一個初始化應用程序來說,目前GameApp類的非常簡單:

    class GameApp : public D3DApp { public:GameApp(HINSTANCE hInstance);~GameApp();bool Init();void OnResize();void UpdateScene(float dt);void DrawScene(); };

    GameApp::DrawScene方法--每幀畫面的繪制

    ID3D11DeviceContext::ClearRenderTargetView方法--清空需要繪制的緩沖區

    在每一幀畫面繪制的操作中,我們需要清理一遍渲染目標視圖綁定的緩沖區

    void ID3D11DeviceContext::ClearRenderTargetView(ID3D11RenderTargetView *pRenderTargetView, // [In]渲染目標視圖const FLOAT ColorRGBA[4]); // [In]指定覆蓋顏色

    這里的顏色值范圍都是0.0f到1.0f

    比如我們要對后備緩沖區(R8G8B8A8)使用藍色進行清空,可以這樣寫:

    float blue[4] = {0.0f, 0.0f, 1.0f, 1.0f} m_pd3dImmediateContext->ClearRenderTargetView(m_pRenderTargetView.Get(), blue);

    ID3D11DeviceContext::ClearDepthStencilView方法--清空深度/模板緩沖區

    同樣在進行渲染之前,我們也要清理一遍深度/模板緩沖區

    void ID3D11DeviceContext::ClearDepthStencilView(ID3D11DepthStencilView *pDepthStencilView, // [In]深度/模板視圖UINT ClearFlags, // [In]D3D11_CLEAR_FLAG枚舉FLOAT Depth, // [In]深度UINT8 Stencil); // [In]模板初始值

    若要清空深度緩沖區,則需要指定D3D11_CLEAR_DEPTH,模板緩沖區則是D3D11_CLEAR_STENCIL。

    每一次清空我們需要將深度值設為1.0f,模板值設為0.0f。其中深度值1.0f表示距離最遠處:

    m_pd3dImmediateContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

    IDXGISwapChain::Present方法--前后臺緩沖區交換并呈現

    完成一切繪制操作后就可以調用該方法了

    HRESULT ID3D11DeviceContext::Present( UINT SyncInterval, // [In]通常為0UINT Flags); // [In]通常為0

    GameApp::DrawScene的實現如下:

    void GameApp::DrawScene() {assert(m_pd3dImmediateContext);assert(m_pSwapChain);static float blue[4] = { 0.0f, 0.0f, 1.0f, 1.0f }; // RGBA = (0,0,255,255)m_pd3dImmediateContext->ClearRenderTargetView(m_pRenderTargetView.Get(), blue);m_pd3dImmediateContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);HR(m_pSwapChain->Present(0, 0)); }

    最終繪制的效果應該如下:

    程序退出后的清理

    因為之前我們用的是智能指針,所以D3DApp的析構函數十分簡單,只需要通過ID3D11DeviceContext::ClearState方法來恢復D3D設備上下文到默認狀態,卸下所有綁定的資源即可。剩下的事情就交給COM智能指針完成:

    D3DApp::~D3DApp() {// 恢復所有默認設定if (m_pd3dImmediateContext)m_pd3dImmediateContext->ClearState(); }

    練習題

    粗體字為自定義題目

  • 嘗試修改項目代碼,讓窗口內的顯示變紅。
  • 某些電腦可能有多于一個的顯示適配器(顯卡)。首先要通過CreateDXGIFactory創建IDXGIFactory,然后使用IDXGIFactory::EnumAdapters來枚舉顯示適配器。嘗試通過這種方式查看你的電腦有多少個顯示適配器(IDXGIAdapter),并察看它們的信息。
  • 一個顯示適配器可能關聯了多個輸出設備(IDXGIOutput),你可以使用IDXGIAdapter::EnumOutputs方法來枚舉出特定的輸出,嘗試觀察它們的信息。
  • 對于給定的像素格式,一個輸出設備可以支持許多種顯示模式(DXGI_MODE_DESC),通過它可以看到全屏寬度、高度、刷新率。嘗試使用IDXGIOutput::GetDisplayModeList方法觀察所有支持的模式(傳遞DXGI_FORMAT_R8G8B8A8_UNORM格式進去)。
  • 默認情況下的窗口程序是可以通過ALT+ENTER來進入/退出全屏的。此外,我們可以通過IDXGISwapChain來動態設置窗口全屏屬性,找到對應的方法并嘗試一下。
  • 現在嘗試指定顯示適配器來創建D3D設備。通過CreateDXGIFactory函數來創建IDXGIFactory,通常它會包含接口IDXGIFactory1,但有可能它也會包含接口IDXGIFactory2。在沒有創建D3D設備的情況下,這種方式就可以幫助我們了解是否可以創建出Direct3D 11.1的設備。為了能夠指定顯示適配器來創建D3D11設備,我們需要將D3D_DRIVER_TYPE強行設置為D3D_DRIVER_TYPE_UNKNOWN,否則在創建設備的時候會得到如下報錯信息:DX ERROR: D3D11CreateDevice: When creating a device from an existing adapter (i.e. pAdapter is non-NULL), DriverType must be D3D_DRIVER_TYPE_UNKNOWN. [ INITIALIZATION ERROR #3146141: ]。
  • DirectX11 With Windows SDK完整目錄

    Github項目源碼

    歡迎加入QQ群: 727623616 可以一起探討DX11,以及有什么問題也可以在這里匯報。

    posted on 2019-05-05 09:46 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

    轉載于:https://www.cnblogs.com/lonelyxmas/p/10811308.html

    總結

    以上是生活随笔為你收集整理的DirectX11 With Windows SDK--01 DirectX11初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲激精日韩激精欧美精品 | 亚洲自拍av在线 | 欧美一级黄大片 | 99国产一区二区三精品乱码 | 精品国产1区2区 | 亚洲更新最快 | 97国产大学生情侣酒店的特点 | 久久伊人八月婷婷综合激情 | 国产精品99久久久久久大便 | 99精品偷拍视频一区二区三区 | 日韩电影一区二区三区 | 久草剧场 | 91九色老 | 99久久精品国产一区二区三区 | 国产免费黄视频在线观看 | 五月天婷婷在线观看视频 | www色婷婷com | 久久九九免费 | 久久久久久久久久久久久国产精品 | 黄污网 | 久久a v视频 | 久久成人国产精品一区二区 | 日韩欧美视频免费看 | 色婷婷国产精品一区在线观看 | 99这里有精品 | 高清中文字幕av | 久草在线最新 | 欧美日韩国产在线 | 亚洲男男gaygay无套 | 色丁香久久 | 天天干天天干天天干 | 在线免费av观看 | 在线va视频 | 日韩三级在线 | 久久国产欧美日韩精品 | 亚洲性xxxx| 欧美激精品| 国产一区二区电影在线观看 | 日日天天干 | 91系列在线观看 | 黄色免费电影网站 | 免费在线观看av网址 | 在线 日韩 av | 亚洲午夜久久久影院 | 99这里只有精品视频 | 91中文视频 | 亚洲免费av在线播放 | 日日干天天操 | 日韩免费不卡av | 国产一级片一区二区三区 | 国产精品国产三级国产不产一地 | 日韩中文在线观看 | 精品夜夜嗨av一区二区三区 | 日韩专区在线播放 | 国产精品九九视频 | 国产又粗又猛又爽又黄的视频免费 | 婷婷综合| 日日插日日干 | 丁香在线观看完整电影视频 | 国产在线久草 | 欧美日韩色婷婷 | 亚洲狠狠 | 欧美日性视频 | 婷婷综合电影 | 欧美aaaxxxx做受视频 | 日韩激情精品 | 国产91在线观看 | 91亚色视频 | 9999精品免费视频 | 日韩欧美成人网 | 国产日本在线 | 国产精品乱码一区二区视频 | 色国产精品 | 久久字幕网 | 中文字幕在线不卡国产视频 | 日韩两性视频 | 久久,天天综合 | 黄影院| 成人精品电影 | 国产中文字幕一区二区三区 | 成人91在线 | 探花视频网站 | 久久久久蜜桃 | 国产精品视频在线观看 | 日韩高清dvd| 国产精品日韩高清 | 91精品麻豆 | 国产一级片不卡 | 2019中文最近的2019中文在线 | 在线免费观看的av网站 | 午夜精品久久久久久久爽 | 久久久国产精品麻豆 | 天天草天天干 | a电影免费看 | 午夜黄网 | 操高跟美女 | 中文av在线免费观看 | 久久久久久久久毛片精品 | 国产不卡毛片 | 黄色av网站在线免费观看 | 中文字幕视频一区 | 久草在线观看视频免费 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲资源在线网 | 在线观看日本高清mv视频 | 夜夜操网 | 国产精品中文在线 | 91色视频| 97人人模人人爽人人喊中文字 | 97免费 | 国产xxxx做受性欧美88 | 99r在线视频| 美女免费黄视频网站 | 天天天色综合 | 91久久精品一区二区三区 | 日韩精品久久久久久中文字幕8 | 久久久国产精品久久久 | 在线观看第一页 | 日韩,精品电影 | 最新中文字幕在线播放 | 操操操日日日干干干 | 亚av在线 | 在线观看视频黄色 | 久久夜色精品国产欧美乱 | 91精彩在线视频 | 色狠狠综合天天综合综合 | 999久久国精品免费观看网站 | 久久理论电影网 | 天天干天天操天天拍 | 91黄色在线视频 | 婷婷色五| 婷婷激情综合五月天 | 天天射天天爱天天干 | 久久久夜色 | 日韩a在线播放 | 欧美精选一区二区三区 | 97超碰人人澡 | 中文字幕免费高清在线 | 国产乱码精品一区二区蜜臀 | 国产精品久久久久久久久久久久 | 9999国产| 伊人www22综合色 | 久久精品99 | 98超碰人人 | 99热精品免费观看 | 99av国产精品欲麻豆 | 中文字幕在线专区 | 日韩电影一区二区在线观看 | 黄色av电影免费观看 | 亚洲作爱视频 | 精品一区二区久久久久久久网站 | 国产精品久久久久久久久久直播 | 亚洲成人av在线 | 日韩免费中文字幕 | 国产99re| 亚洲视频专区在线 | 手机成人在线电影 | 国产精品成人在线观看 | 中文在线字幕免费观 | 日本亚洲国产 | 婷婷在线精品视频 | 亚洲午夜久久久综合37日本 | 成年人视频免费在线播放 | 国产精品久久久99 | 美州a亚洲一视本频v色道 | 欧美色精品天天在线观看视频 | 久久久久久久久久亚洲精品 | 欧美大片aaa| 色偷偷网站视频 | 亚洲撸撸 | 热久久视久久精品18亚洲精品 | 亚洲高清视频在线播放 | 国产黄色av影视 | 高清精品久久 | 狠狠色丁香婷婷综合视频 | 欧美做受69 | 欧美成人手机版 | 超碰人人超碰 | 国产精品久久一区二区无卡 | 中文字幕资源在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久综合久色欧美综合狠狠 | 四虎4hu永久免费 | 久久五月婷婷综合 | 日韩美av在线 | 日韩欧美国产成人 | 欧美污污视频 | 免费在线播放视频 | 久久国产午夜精品理论片最新版本 | 男女全黄一级一级高潮免费看 | 久久艹国产视频 | 国内精品久久天天躁人人爽 | 伊人网站 | 91精品久久久久久久99蜜桃 | 成人久久综合 | 久久精品国产久精国产 | 日韩免费电影网 | 日韩av中文字幕在线 | 日韩 在线a | 91麻豆精品91久久久久同性 | 日日色综合 | 91日本在线播放 | 九九热免费视频在线观看 | 玖玖视频国产 | 人人涩| 少妇超碰在线 | 国产色网 | 亚洲免费在线视频 | 久久久三级视频 | 99久久婷婷国产综合亚洲 | 国产又粗又猛又黄又爽的视频 | 久99久中文字幕在线 | 97爱 | 日韩高清一二三区 | 国产精品一区二区在线 | 天天曰夜夜爽 | 免费视频一区 | 在线之家免费在线观看电影 | 在线观看免费日韩 | 视频91在线 | 97视频网址 | av在线收看 | 天天爽天天碰狠狠添 | 91一区啪爱嗯打偷拍欧美 | 国产高清免费视频 | www.狠狠插.com | 四虎在线免费观看视频 | 久草视频在线免费 | 伊人五月婷 | 色九九在线 | 国产97免费| 日韩欧美一区二区在线观看 | 久久精品国产免费看久久精品 | 蜜桃传媒一区二区 | 久久综合狠狠综合 | 国产成人99久久亚洲综合精品 | 中国一级片在线 | 91精品国产99久久久久久红楼 | 色综合天 | 日韩爱爱网站 | 欧洲精品久久久久毛片完整版 | 日韩中文字幕国产 | 亚洲视频999| 欧美激情综合五月色丁香小说 | 一级a毛片高清视频 | 久久国产麻豆 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品自拍av | 成人av久久| 久久九九精品久久 | 500部大龄熟乱视频使用方法 | 狠狠操电影网 | 日韩高清三区 | 激情丁香在线 | 欧美一级欧美一级 | 免费视频99 | 欧美日韩精品在线免费观看 | 青春草免费在线视频 | 婷五月激情 | 久久99中文字幕 | 91精品国产福利在线观看 | 黄色特级一级片 | 久久激情日本aⅴ | 日韩久久片| 久久久夜色 | 青草视频在线 | 91亚洲精品国偷拍自产在线观看 | 亚洲精品国产高清 | 99久久久免费视频 | 97超碰在线久草超碰在线观看 | 日韩成人精品一区二区三区 | 国产九九九精品视频 | 国产九九热 | 国产精品美女久久久久久免费 | 国产在线成人 | 久久美女电影 | 天天天干天天天操 | 国产专区精品 | 中文字幕亚洲欧美 | 久久久久久久久福利 | 91麻豆精品国产自产 | 人人爽久久久噜噜噜电影 | 综合在线亚洲 | 欧美日韩国产一区二区三区 | 麻豆视频国产在线观看 | 欧美黄网站| 国产成人黄色在线 | 五月天久久婷 | 啪嗒啪嗒免费观看完整版 | 99性视频| 亚洲成人第一区 | 日韩欧美一区二区三区黑寡妇 | 亚洲国产日韩一区 | 中文字幕在线观看免费观看 | 九色91av | 91中文在线 | 欧美日本不卡高清 | 亚洲精品视频在线看 | 欧美综合在线观看 | 亚洲一区二区三区在线看 | 久草在在线视频 | 99久久精品免费看国产四区 | 免费69视频| 最近字幕在线观看第一季 | 国产亚州精品视频 | 在线观看一区二区精品 | 成人97视频一区二区 | 欧美日韩xx | 国产精品免费一区二区三区在线观看 | 五月婷婷激情 | 久久久国产99久久国产一 | 久久精品a | www·22com天天操| 九九热精品视频在线播放 | 欧美日韩1区 | 久草在线观看资源 | 在线观看一| 91丨九色丨蝌蚪丨老版 | 91精品一区二区三区久久久久久 | 奇米网在线观看 | 国产成人福利在线观看 | a特级毛片 | 亚州av免费 | 国产精品久久影院 | 国产精品久久免费看 | 国产精品永久久久久久久www | 超碰在线91| 国产中文字幕网 | 免费日韩三级 | 中文字幕av播放 | 一区二区三区精品在线 | 高清美女视频 | 九九在线精品视频 | 黄色免费视频在线观看 | 97综合视频 | 97精品久久 | 久视频在线| 久久视频 | av黄色在线播放 | 精品91久久久久 | 欧洲精品视频一区二区 | 日韩一区二区三免费高清在线观看 | 亚洲春色奇米影视 | 久草网首页 | 亚洲午夜久久久久 | 不卡精品 | 激情深爱 | 高清视频一区 | 99在线精品视频观看 | 亚洲 欧美 国产 va在线影院 | 国产精品久久久久免费 | 欧美一级免费黄色片 | av成人免费在线 | 国产精品v a免费视频 | 999超碰 | 国产无遮挡又黄又爽在线观看 | 在线看不卡av | 天堂av在线免费观看 | 日韩在线视频观看 | 中文字幕资源网 国产 | 国产精品久久久久久久久久尿 | 香蕉视频网站在线观看 | 婷婷草| av亚洲产国偷v产偷v自拍小说 | 999精品视频| 免费成人在线网站 | 成人全视频免费观看在线看 | 色com| 九九日韩 | 久久久国产精华液 | 久久成视频| 97韩国电影| 天天色天天骑天天射 | 国产精品99久久久久久宅男 | 亚洲 欧美 日韩 综合 | 免费污片 | 国产又黄又爽无遮挡 | 在线色视频小说 | 欧美日韩综合在线 | 久久天堂网站 | 国产精品免费久久久久久久久久中文 | 福利视频 | 伊人天天干 | 91视频高清免费 | av成人免费观看 | 久草在线资源视频 | 五月天开心 | 91九色porny蝌蚪视频 | 免费日p视频 | 午夜精品久久久久久中宇69 | 久久久久久欧美二区电影网 | 中文字幕亚洲字幕 | 黄色av免费 | 欧美久久久久久久久中文字幕 | a视频在线观看 | 在线播放91 | 一区在线观看 | 亚洲精品a区 | 激情视频网页 | av网址aaa | 一 级 黄 色 片免费看的 | 五月天丁香综合 | 最近高清中文字幕 | 天天干天天操天天操 | 日韩99热 | 免费看麻豆 | 麻花豆传媒一二三产区 | 激情五月五月婷婷 | 在线观看亚洲视频 | 九九三级毛片 | 992tv又爽又黄的免费视频 | 最新国产精品久久精品 | 欧美美女激情18p | 一本一本久久a久久精品牛牛影视 | 国产精品理论片在线播放 | 97av在线 | 久久草在线精品 | 久久综合九色综合久久久精品综合 | 天天干夜夜操视频 | 亚洲精品66| 91传媒免费观看 | 欧美一级电影在线观看 | 91精品国产99久久久久久红楼 | 国产中文字幕在线观看 | 成人a视频在线观看 | 国产麻豆果冻传媒在线观看 | 亚洲国产中文在线观看 | 亚洲国产精品传媒在线观看 | 91免费看黄| 亚洲人片在线观看 | 久久久精品小视频 | 国产麻豆电影 | 最新日本中文字幕 | 亚洲激情在线视频 | 久久大视频 | 婷婷干五月 | 韩国精品一区二区三区六区色诱 | 黄色大片视频网站 | 99精品成人 | 精品夜夜嗨av一区二区三区 | 91精品国产自产在线观看 | 97人人模人人爽人人喊中文字 | 很黄很黄的网站免费的 | 色多多污污在线观看 | 久草视频在线免费 | 亚洲国产成人久久 | 久久精品国产第一区二区三区 | 久久免费一级片 | adn—256中文在线观看 | 久草电影免费在线观看 | 91成年人视频 | 97在线精品视频 | 亚洲精品五月 | 国产 日韩 在线 亚洲 字幕 中文 | 一区二区伦理电影 | 久久久国产一区二区三区四区小说 | 黄色av影视 | 免费观看十分钟 | 亚洲欧洲精品久久 | 在线观看国产成人av片 | av看片在线观看 | 综合网婷婷 | 丁香婷婷久久 | 亚洲春色综合另类校园电影 | 国产一二三四在线视频 | 一区二区精品在线视频 | 国产精久久久久久妇女av | 国产高清综合 | 激情五月看片 | 日韩va欧美va亚洲va久久 | 天天天天射 | 日韩成人av在线 | 99久久婷婷 | 欧美日韩在线看 | 999久久精品| 欧美精品久久久久久久亚洲调教 | 日本性xxxxx 亚洲精品午夜久久久 | av在线播放快速免费阴 | 久久人人爽人人片 | 美女免费黄网站 | 久久99精品久久久久久秒播蜜臀 | www.啪啪.com | 97色噜噜 | 国产精品高潮呻吟久久av无 | 字幕网av | 久久综合中文字幕 | 国产污视频在线观看 | 久久97久久 | 日韩精品一区二区三区中文字幕 | 久草网站 | 成人污视频在线观看 | 久久免费视频网 | 日韩久久网站 | 99久久久久| 欧美精品免费在线 | 免费在线观看日韩 | 久草视频播放 | www.xxxx欧美| 四虎在线免费观看 | 91久久国产露脸精品国产闺蜜 | 人人干网 | 欧美日韩色婷婷 | 国产经典 欧美精品 | 国产精品视频大全 | 久久国产三级 | 成人免费共享视频 | 亚洲国产精品成人av | 国产一性一爱一乱一交 | 日韩小视频网站 | 久久新视频 | 手机看片中文字幕 | 精品专区| 精品色999 | 免费电影播放 | 国产成人精品一区二区在线观看 | 国产91aaa| 久久综合欧美精品亚洲一区 | а中文在线天堂 | 日韩视频 一区 | 国产成人777777 | 99热这里是精品 | 黄网站色欧美视频 | 久久99视频免费观看 | 久久久高清一区二区三区 | 成人免费网站视频 | 日韩精品中文字幕在线不卡尤物 | 日韩av在线看 | 最新高清无码专区 | 九九在线播放 | 青青河边草免费 | 一区二区视频在线免费观看 | 香蕉视频亚洲 | 操夜夜操 | 久久久久中文 | 99免费观看视频 | 天天天干夜夜夜操 | 日韩高清精品一区二区 | 99操视频 | 久久伦理 | 九九视频这里只有精品 | 亚洲无线视频 | 亚洲黄色成人av | 国产小视频你懂的在线 | 国产一级黄色av | 久久精品中文字幕一区二区三区 | 日韩精选在线 | 久草在线一免费新视频 | 中文字幕免费在线 | www五月 | 天天操天天射天天爱 | 久久8| 久久好看免费视频 | 96久久久 | 国语对白少妇爽91 | 超碰人人草 | 日韩av一区二区在线影视 | 欧美久久久久久久久久久 | 国产日韩av在线 | 中文字幕资源站 | 久久福利小视频 | 午夜精品婷婷 | 色欧美视频 | 久久综合久久久 | 国产中文字幕在线看 | 亚洲理论影院 | 久久精品理论 | а天堂中文最新一区二区三区 | 韩日三级在线 | 国内亚洲精品 | 国产麻豆精品传媒av国产下载 | 欧美一区二区在线免费观看 | 久久超碰97| 亚洲爱av | 蜜臀久久99静品久久久久久 | 免费合欢视频成人app | 国产一区二区高清不卡 | 粉嫩av一区二区三区免费 | 天天干夜夜想 | 日韩在线 一区二区 | 精品一区二区在线看 | 国产午夜精品一区二区三区四区 | 日本动漫做毛片一区二区 | 久久国产视频网 | 午夜影院一级片 | 国产精品少妇 | 国产精品久久久久久99 | 久久久久国产精品免费免费搜索 | 久久99热这里只有精品 | 久久久久久久看片 | 国产一级二级在线 | 中文字幕一区2区3区 | 婷婷在线精品视频 | 超碰在线公开 | 午夜18视频在线观看 | 国产 视频 高清 免费 | 国产一级做a爱片久久毛片a | 一级一片免费看 | 欧美日韩激情视频8区 | 麻豆国产露脸在线观看 | 欧美日本一二三 | 人人干人人爽 | 97视频在线观看网址 | 久草视频99 | 国产 视频 久久 | 91成人精品一区在线播放69 | 中文字幕一区二区三区在线视频 | 日韩激情中文字幕 | 久久久久99999 | 久久久久久综合网天天 | 欧美精品久久久久久久久久久 | 97视频入口免费观看 | 黄色大片av | aaa日本高清在线播放免费观看 | 久久久蜜桃| 黄色在线免费观看网址 | 手机色站 | 国产一区在线视频 | 在线观看视频三级 | 久久久免费观看 | 久久国产精品一区二区三区四区 | 天天操夜夜操国产精品 | 欧美日韩破处 | 视频三区 | 日日夜夜天天人人 | 国产亚洲午夜高清国产拍精品 | 久久av免费观看 | 一级成人免费 | av天天澡天天爽天天av | 亚洲涩涩网 | 99中文字幕| 久久99亚洲精品久久 | 久免费视频 | 久久电影网站中文字幕 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 五月婷婷.com | 国产a网站 | 亚洲资源网 | 久久久久一区二区三区四区 | 激情图片久久 | 国产香蕉视频 | 91在线porny国产在线看 | 国内精品免费 | 天天色天天草天天射 | 国产色区 | 成人av在线一区二区 | 国产高清在线视频 | 久久影视精品 | 久久夜色精品国产欧美一区麻豆 | 免费性网站 | 成人网在线免费视频 | 精品久久久久久国产偷窥 | 天天插天天狠 | 亚洲资源在线 | 黄网av在线 | 国产专区视频在线 | 91精品免费 | 伊人天天综合 | 日韩欧美在线观看一区二区 | 91av片| 久久久久综合视频 | 国内精品久久久久久久97牛牛 | 成人国产精品久久久久久亚洲 | 天天天在线综合网 | 国产精品久久久久久69 | 黄色免费电影网站 | 久久艹影院 | 国产尤物一区二区三区 | 伊人久久精品久久亚洲一区 | 色久天| 狂野欧美激情性xxxx欧美 | 91热爆在线观看 | 欧美日韩不卡一区二区 | 国产精品1区2区 | 97超碰人人在线 | 久久久久久免费网 | 99久久久国产精品免费99 | 久久久国产影院 | 国产精品久久久一区二区三区网站 | 女人18毛片a级毛片一区二区 | 国产精品麻豆一区二区三区 | 久久激情精品 | 国产真实精品久久二三区 | 久久老司机精品视频 | 国产高清在线观看av | 天天色成人网 | 免费黄在线观看 | 久久激情小说 | 亚洲精品在线视频网站 | 亚洲欧美日韩国产一区二区 | 一性一交视频 | 中文字幕一区二区三区视频 | 日本资源中文字幕在线 | 高清av在线免费观看 | 国产精品视频免费在线观看 | 91成品人影院 | 久久草在线视频国产 | 国产经典 欧美精品 | 精品96久久久久久中文字幕无 | 在线精品亚洲一区二区 | 色网址99 | 国产免费a| 国产日韩一区在线 | 日韩免费电影在线观看 | 国产原创在线 | 亚洲一一在线 | 精品欧美乱码久久久久久 | 在线免费观看欧美日韩 | 国产a高清| 日韩免费视频网站 | 在线观看亚洲国产精品 | 欧美精品第一 | 91精品视频一区二区三区 | 亚洲精品欧美精品 | 免费av网站在线 | 久久久精品网 | 日韩精品免费一区二区在线观看 | 人人干狠狠操 | 成人影视片| 成人夜晚看av | 波多野结衣在线中文字幕 | 久久精品超碰 | 亚洲精品乱码久久久久久久久久 | 一本一本久久a久久精品综合小说 | 激情av一区二区 | 国产精品久久片 | 欧美大片在线看免费观看 | 中文资源在线观看 | 91大神精品视频在线观看 | 韩国av一区 | 国产成人精品女人久久久 | 免费色黄 | 久久综合天天 | 亚洲精品美女久久17c | 在线视频观看你懂的 | 成人h视频 | 香蕉视频在线免费 | 91亚洲精品乱码久久久久久蜜桃 | 日韩性xxxx| 国内视频 | 午夜精品一区二区三区四区 | 免费99精品国产自在在线 | 午夜精品一区二区三区在线播放 | 精品资源在线 | 在线视频a | 91最新中文字幕 | 亚州欧美视频 | 久av在线 | 亚洲成人av影片 | 最新av观看 | 久久免费视频在线观看6 | 在线播放 一区 | av日韩中文 | ww视频在线观看 | 66av99精品福利视频在线 | 国产精品国产自产拍高清av | 日韩午夜视频在线观看 | 91麻豆精品91久久久久同性 | 久久中文字幕导航 | 成人在线免费观看视视频 | 日韩在线观看第一页 | 日本中文字幕影院 | 色橹橹欧美在线观看视频高清 | 欧美国产日韩一区二区 | 日本中文字幕久久 | 黄色1级大片 | 999国产精品视频 | 色婷婷综合在线 | 久久久久女人精品毛片 | 人人藻人人澡人人爽 | 六月天综合网 | 国产一级做a爱片久久毛片a | 国产精品theporn | 国产成人av网址 | 久久狠狠干 | 国产精品免费视频观看 | 91丨九色丨国产在线观看 | 日韩中文字幕在线观看 | 黄色大片视频网站 | 欧美日韩免费在线观看视频 | 激情伊人五月天 | 91精品在线免费视频 | 国产 日韩 中文字幕 | 丰满少妇在线观看网站 | 日韩毛片在线免费观看 | 午夜国产一区二区 | 色网站国产精品 | 亚洲美女免费视频 | 国产成人精品一区二区三区免费 | av免费在线网站 | 97福利 | 二区三区在线 | 最近中文字幕免费观看 | 免费在线观看91 | 97精品一区二区三区 | 九九免费在线观看视频 | 99色| 99视频+国产日韩欧美 | 黄色精品免费 | 久久精品亚洲国产 | 亚洲爱av | 欧美成人在线免费观看 | 久久精品久久精品 | 91天堂影院 | 男女激情免费网站 | 国产精品一区二区av日韩在线 | 日本久久精品视频 | 久久久www免费电影网 | 婷婷丁香久久五月婷婷 | 99国产精品一区二区 | 全久久久久久久久久久电影 | 丁香六月婷婷激情 | 免费三级av | 亚洲精品久久久久999中文字幕 | 天天伊人狠狠 | 麻豆91小视频 | 国产精品福利无圣光在线一区 | 国产精品对白一区二区三区 | 国产精品手机播放 | 亚洲激情综合网 | 成人xxxx | 激情综合久久 | 五月天,com | 久草99 | 亚洲精品美女久久久 | 欧美一二三视频 | 日韩精品一区二区三区不卡 | 亚洲国产手机在线 | 国产只有精品 | 国产精品成人免费一区久久羞羞 | 一本一道久久a久久综合蜜桃 | 天天干天天操天天 | 久艹视频在线免费观看 | 色婷五月天 | 成人国产一区 | 99精品黄色| 爱情影院aqdy鲁丝片二区 | 五月天天色 | 中文字幕在线日亚洲9 | 国产精品国产三级国产 | 99超碰在线观看 | 亚洲国产精品久久久久婷婷884 | 丁香婷婷色 | 午夜精品视频福利 | 精品亚洲国产视频 | 国产精品99久久久久久久久久久久 | 9999在线 | 久草视频在线免费 | 丝袜一区在线 | 欧美热久久 | 国产精品一区二区三区电影 | 成人中文字幕+乱码+中文字幕 | 日本不卡一区二区三区在线观看 | 亚洲国产精品久久久 | 国产精品嫩草在线 | 欧美精品久久久久久久久久丰满 | 六月色丁香 | 国产黄色大片 | 国产亚洲亚洲 | 国产毛片久久久 | 婷婷色网址 | 久久久免费电影 | 亚洲精品高清视频在线观看 | 精品在线不卡 | 婷婷在线免费视频 | 五月天天色 | 免费看一级黄色大全 | 日韩亚洲国产中文字幕 | 精品在线视频一区 | 色婷婷一区 | 黄色日视频 | 亚洲天堂网站 | 五月天欧美精品 | 亚洲日本一区二区在线 | 黄色大片国产 | 中文字幕色在线 | 婷婷精品视频 | 国产亚洲视频在线免费观看 | 99精品国产成人一区二区 | 一区二区三区影院 | 国产精品2019 | 亚洲国产精品一区二区久久,亚洲午夜 | 国内一区二区视频 | 99视频+国产日韩欧美 | 亚洲成人av在线电影 | 久久久久国产精品一区二区 | 中文视频在线 | 午夜视频黄 | 日韩高清黄色 | 国产一区在线视频 | 久草视频观看 | 一区二区久久久久 | 人人干人人草 | 亚洲日本欧美 | 国产精品69av | 手机av在线网站 | 免费a级大片 | 久久看视频 | 日韩视频在线一区 | 亚洲免费av在线播放 | 国产人成精品一区二区三 | 亚洲欧美综合 | 天天人人综合 | 国产精品免费视频网站 | 综合久久久| 婷婷在线精品视频 | 久操视频在线观看 | 黄色毛片视频免费 | 亚洲免费av观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 区一区二在线 | 国产不卡免费av | 亚洲永久字幕 | 在线播放日韩av | 久久在线免费观看视频 | 日韩欧美一二三 | 亚洲蜜桃在线 | 午夜私人影院 | mm1313亚洲精品国产 | 成人国产一区二区 | 少妇搡bbbb搡bbb搡aa | 国产剧在线观看片 | 五月婷在线视频 | 久久综合影音 | 色综合婷婷 | 国产手机av | 成人av视屏 | 免费观看视频黄 | 国产亚洲情侣一区二区无 | 久艹在线观看视频 | 99久久日韩精品免费热麻豆美女 | 久久视频在线视频 | 色综合激情久久 | 亚一亚二国产专区 | 天天干天天草天天爽 | 亚洲va天堂va欧美ⅴa在线 | 香蕉视频网站在线观看 | 天天草天天摸 | 免费男女网站 | 午夜久久网站 | 天天色综合1 | av黄色免费在线观看 | 精品国模一区二区 | 中文有码在线视频 | 亚洲激情六月 | 久久久免费看片 | 五月亚洲综合 | 亚洲精品在线观看不卡 | 九九在线视频免费观看 | 天天玩夜夜操 | 99久久久久久久 | 视频在线一区二区三区 | 国产91免费在线 | 国产在线欧美在线 | 国产无遮挡猛进猛出免费软件 | av三区在线 | 这里只有精品视频在线 | 国产不卡一区二区视频 | 美女在线免费视频 | 午夜精品麻豆 | 国产高清免费在线观看 | 中文字幕在线播放一区二区 | 日韩在线视频一区 | www99久久| 久久精品国产一区二区三区 | 啪啪肉肉污av国网站 | 日本精品视频在线播放 | av三区在线| 黄污视频网站大全 | 99这里精品| 国产成人精品一区二区三区 | 欧美国产日韩中文 | 手机成人av在线 | 国产成人一区二区三区在线观看 | 国产精品99久久久久久久久久久久 | 久久99最新地址 | 青青草在久久免费久久免费 | www九九热 | 精品国模一区二区三区 | 99国产精品久久久久老师 | 欧美a级成人淫片免费看 | 99久久超碰中文字幕伊人 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲视频h| av在线看网站 | 免费看的国产视频网站 | 日韩精品中文字幕久久臀 | 99操视频| 在线国产福利 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 九九热精品视频在线观看 | 久久免费99精品久久久久久 | 日韩欧美视频二区 | 亚洲经典视频在线观看 | 亚州精品视频 | 日韩在线观看a | 人人插人人插 | 亚洲欧美999| 中文字幕一区二区三区久久蜜桃 |