本篇將簡單整理Direct3D 10的初始化,具體內容參照《 Introduction to 3D Game Programming with DirectX 10》(中文版有湯毅翻譯的電子書《DirectX 10 3D游戲編程入門》)。
Direct3D 10的初始化可分為以下幾個步驟:
1.填充一個DXGI_SWAP_CHAIN_DESC結構體,用於描述了所要創建的交換鏈特性。
2.使用D3D10CreateDeviceAndSwapChain函數創建ID3D10Device設備接口和IDXGISwapChain交換鏈接口。
3.為交換鏈后台緩沖區創建一個渲染目標視圖。
4.創建深度/模板緩沖區以及相關的深度/模板視圖。
5.將渲染目標視圖和深度/模板視圖綁定到渲染管線的輸出合並器階段,使它們可以被 Direct3D 使用。
6.設置視口。
1.描述交換鏈
填充一個DXGI_SWAP_CHAIN_DESC結構體,該結構體定義如下:
1 typedef struct DXGI_SWAP_CHAIN_DESC 2 { 3 DXGI_MODE_DESC BufferDesc; 4 DXGI_SAMPLE_DESC SampleDesc; 5 DXGI_USAGE BufferUsage; 6 UINT BufferCount; 7 HWNDOutput Window; 8 BOOL Windowed; 9 DXGI_SWAP_EFFECT SwapEffect; 10 UINT Flags; 11 }DXGI_SWAP_CHAIN_DESC;
BufferDesc:指定顯示模式,其中的DXGI_MODE_DESC類型是另一個結構體,其定義如下:
1 typedef struct DXGI_MODE_DESC 2 { 3 UINT Width;//寬度 4 UINT Height;//高度 5 DXGI_RATIONAL RefreshRate;//刷新率 6 DXGI_FORMAT Format;//像素格式 7 DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;//掃描方式 8 DXGI_MODE_SCALING Scaling;//伸縮比例 9 }DXGI_MODE_DESC;
SampleDesc:進行多重采樣設置,其中的DXGI_SAMPLE_DESC定義如下:
1 typedef struct DXGI_SAMPLE_DESC 2 { 3 UINT Count;//每像素多重采樣個數 4 UINT Quality;//圖像質量等級,等級越高,性能越低,可選范圍是0到ID3D10Device::CheckMultisampleQualityLevels 5 }DXGI_SAMPLE_DESC;
默認的sample模式是:Count=1,Quality=0,即不采用多重采樣。
BufferUsage:設置CPU訪問后台緩沖區的選項。后台緩沖區用於shader input或者render-target output階段。一般使用DXGI_USAGE_RENDER_TARGET_OUTPUT。
BufferCount:指定交換鏈中緩沖區的數量。
OutputWindow:指定圖形繪制窗口。Windowed標識顯示方式。若Windowed為TRUE,以窗口方式顯示;若為FALSE,以全屏方式顯示。
SwapEffect:指定系統將后台緩沖區的內容復制到前台緩沖區的方式。其枚舉如下:
1 typedef enum DXGI_SWAP_EFFECT 2 { 3 DXGI_SWAP_EFFECT_DISCARD = 0, 4 DXGI_SWAP_EFFECT_SEQUENTIAL = 1 5 }DXGI_SWAP_EFFECT;
DXGI_SWAP_EFFECT_DISCARD:后台緩存復制到前台緩存后,清除后台緩存內容。這個選項,讓顯卡驅動程序選擇最高效的顯示模式;只能在交換鏈中只有一個后台緩沖區的情況下使用。
DXGI_SWAP_EFFECT_SEQUENTIAL:后台緩存復制到前台緩存后,保留后台緩存原內容不變。這個選項,讓交換鏈按順序顯示所有后台緩沖區中的內容。不能使用多重采樣反走樣。
Flags:可選的標志值,用於描述交換鏈的選項。該成員是DXGI_SWAP_CHAIN_FLAG枚舉類型,其枚舉定義如下:
1 typedef enum DXGI_SWAP_CHAIN_FLAG 2 { 3 DXGI_SWAP_CHAIN_FLAG_NONPREROTATED = 1, 4 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH = 2, 5 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE = 4, 6 DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT = 8, 7 DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER = 16, 8 DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY = 32 9 }DXGI_SWAP_CHAIN_FLAG;
DXGI_SWAP_CHAIN_FLAG_NONPREROTATED :關閉圖像自動翻轉,當把前台緩沖區的內容轉換到顯示器上時,即不進行圖像翻轉。若程序想自己控制圖像翻轉顯示的話,通過使用這個標志避免帶寬性能損失。在全屏模式下才有效。
DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH :讓程序通過調用IDXGISwapChain::ResizeTarget來轉換模式。當應用程序切換到全屏模式時,Direct3D會自動選擇與當前的后台緩沖區設置最匹配的顯示模式。
如果未指定Flags標志值,當應用程序切換到全屏模式時,Direct3D會使用當前的桌面顯示模式。
描述交換鏈示例:
1 //交換鏈描述 2 DXGI_SWAP_CHAIN_DESC sd; 3 4 //后台緩沖區描述 5 6 //寬度、高度 7 sd.BufferDesc.Width = WINDOW_WIDTH; 8 sd.BufferDesc.Height = WINDOW_HEIGHT; 9 10 //像素格式 11 sd.BufferDesc.Format = DXGI_FORMAT_R8G8_UNORM; 12 13 //刷新率 14 sd.BufferDesc.RefreshRate.Numerator = 60; 15 sd.BufferDesc.RefreshRate.Denominator = 1; 16 17 //掃描方式 18 sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 19 20 //按比例伸縮 21 sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; 22 23 //多重采樣描述 24 25 //每像素多重采樣個數 26 sd.SampleDesc.Count = 1; 27 28 //圖像質量等級,可選范圍為0到ID3D10Device::CheckMultisampleQualityLevels 29 sd.SampleDesc.Quality = 0; 30 31 //CPU訪問后台緩沖區的選項 32 sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 33 34 //后台緩沖區數量 35 sd.BufferCount = 1; 36 37 //進行渲染的窗口句柄 38 sd.OutputWindow = hMainWnd; 39 40 //窗口/全屏顯示 41 sd.Windowed = TRUE; 42 43 //將后台緩沖區內容復制到前台緩沖區的方式 44 sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; 45 46 //交換鏈行為 47 sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
2.創建設備接口和交換鏈接口
先聲明兩個接口:指向ID3D10Device類型的設備接口和指向IDXGISwapChain類型的交換鏈接口。
這兩個接口可以通過下面函數進行創建:
1 HRESULT D3D10CreateDeviceAndSwapChain( 2 IDXGIAdapter *pAdapter, 3 D3D10_DRIVER_TYPE DriverType, 4 HMODULE Software, 5 UINT Flags, 6 UINT SDKVersion, 7 DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, 8 IDXGISwapChain **ppSwapChain, 9 ID3D10Device **ppDevice);
pAdapter:指定顯卡序號,表示要為哪個物理顯卡創建設備對象。設為空值時,表示使用主顯卡。
DriverType:指定Direct3D設備類型。該成員是D3D_DRIVER_TYPE枚舉類型,該枚舉類型定義如下:
1 typedef enum D3D10_DRIVER_TYPE 2 { 3 D3D10_DRIVER_TYPE_HARDWARE = 0, 4 D3D10_DRIVER_TYPE_REFERENCE = 1, 5 D3D10_DRIVER_TYPE_NULL = 2, 6 D3D10_DRIVER_TYPE_SOFTWARE = 3, 7 D3D10_DRIVER_TYPE_WARP = 5, 8 }D3D10_DRIVER_TYPE;
D3D10_DRIVER_TYPE_HARDWARE:一般使用該參數,表示使用3D硬件加快渲染速度。
D3D10_DRIVER_TYPE_REFERENCE:創建引用設備。引用設備為Direct3D的軟件實現,具有Direct3D所有功能,但運行速度非常慢。使用引用設備主要用於:測試硬件不支持的代碼,例如在一塊不支持Direct3D 10的顯卡上測試Direct3D 10代碼;測試驅動程序缺陷,當代碼能在引用設備上正常運行,而在硬件上不能正常運行時,說明硬件驅動程序可能存在缺陷。
Software:用於軟件光柵化設備。如果DriverType是D3D_DRIVER_TYPE_SOFTWARE,此值不能為NULL,且必須先安裝一個軟件光柵化設備。否則設置為NULL,因為使用硬件加速渲染。
Flags:可選的設備創建標志值。該成員是D3D10_CREATE_DEVICE_FLAG枚舉類型,該枚舉類型定義如下:
1 typedef enum D3D10_CREATE_DEVICE_FLAG 2 { 3 D3D10_CREATE_DEVICE_SINGLETHREADED = 0x1, 4 D3D10_CREATE_DEVICE_DEBUG = 0x2, 5 D3D10_CREATE_DEVICE_SWITCH_TO_REF = 0x4, 6 D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS = 0x8, 7 D3D10_CREATE_DEVICE_ALLOW_NULL_FROM_MAP = 0x10, 8 D3D10_CREATE_DEVICE_BGRA_SUPPORT = 0x20, 9 D3D10_CREATE_DEVICE_STRICT_VALIDATION = 0x200 10 }D3D10_CREATE_DEVICE_FLAG;
D3D10_CREATE_DEVICE_DEBUG:當以debug模式生成程序時,參數應設為D3D10_CREATE_DEVICE_DEBUG,以激活調試層。在指定調試標志后,Direct3D會向VS輸出窗口發送調試信息。否則,即當以release模式生成程序時,Flags設為空。
SDKVersion:SDK版本,始終設為 D3D10_SDK_VERSION。
pSwapChainDesc:指向DXGI_SWAP_CHAIN_DESC結構體的指針,即指向一開始填充的交換鏈描述結構體。
ppSwapChain:用於返回創建后的交換鏈對象。即應指向所要創建的IDXGISwapChain類型的交換鏈接口。
ppDevice:用於返回創建后的設備對象。即應指向所要創建的ID3D10Device類型的設備接口。
D3D10CreateDeviceAndSwapChain函數調用示例:
1 //運行層開關 2 UINT createDeviceFlags = NULL; 3 #if defined(DEBUG) || defined(_DEBUG) 4 createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; 5 #endif 6 7 //創建設備和交換鏈 8 ID3D10Device* pd3dDevice; 9 IDXGISwapChain* pSwapChain; 10 D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &pSwapChain, &pd3dDevice);
3.創建渲染目標視圖
先聲明兩個接口:指向ID3D10RenderTargetView類型的渲染目標視圖接口和指向ID3D10Texture2D類型(或者其他資源格式)的后台緩沖區.
通過交換鏈接口調用IDXGISwapChain::GetBuffer方法來獲取后台緩沖區指針。同時應注意,每次調用該方法后,后台緩沖區的COM引用計數會向上遞增一次,所以應配對使用Release方法。GetBuffer方法如下:
1 HRESULT IDXGISwapChain::GetBuffer( 2 UINT Buffer, 3 const IID &riid, 4 void **ppSurface);
Buffer:表示所要獲取的后台緩沖區的索引。由於后台緩沖區數量可以大於1,所以必須指定索引。
riid:緩沖區接口類型。通常為2D紋理,即ID3D10Texture2D。
ppSurface:指向所返回的后台緩沖區的指針。
通過設備接口調用ID3D10Device::CreateRenderTargetView方法創建渲染目標視圖。CreateRenderTargetView方法如下:
1 HRESULT ID3D10Device::CreateRenderTargetView( 2 ID3D10Resource *pResource, 3 const D3D10_RENDER_TARGET_VIEW_DESC *pDesc, 4 ID3D10RenderTargetView **ppRTView);
pResource:指定將要作為渲染目標的資源。如將后台緩沖區作為渲染目標。
pDesc:指向D3D10_RENDER_TARGET_VIEW_DESC結構體的指針,該結構體描述渲染目標即參數pResource所指定的資源中的元素的數據類型。如果創建資源時使用強類型,則可為空,表示以資源自身格式為視圖格式。
ppRTView:指向創建后所要返回的渲染目標視圖對象的指針。
渲染目標視圖創建示例:
1 //創建渲染目標視圖 2 ID3D10RenderTargetView* pRenderTargetView; 3 ID3D10Texture2D* pBackBuffer; 4 pSwapChain->GetBuffer(NULL, __uuidof(ID3D10Texture2D), reinterpret_cast<VOID**>(&pBackBuffer)); 5 pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &pRenderTargetView); 6 pBackBuffer->Release();
4.創建深度/模板緩沖區及其視圖
填充一個D3D10_TEXTURE2D_DESC結構體,該結構體定義如下:
1 typedef struct D3D10_TEXTURE2D_DESC 2 { 3 UINT Width; 4 UINT Height; 5 UINT MipLevels; 6 UINT ArraySize; 7 DXGI_FORMAT Format; 8 DXGI_SAMPLE_DESC SampleDesc; 9 D3D10_USAGE Usage; 10 UINT BindFlags; 11 UINT CPUAccessFlags; 12 UINT MiscFlags; 13 }D3D10_TEXTURE2D_DESC;
Width:紋理寬度,單位為紋理元素。
Height:紋理高度,單位為紋理元素。
MipLevels:多級漸進紋理層數量。對於深度/模板緩沖區,只需一個多級漸進紋理層。
ArraySize:紋理數組中的紋理數量。對於深度/模板緩沖區,只需一個紋理。
Format:一個DXGI_FORMAT枚舉類型成員,指定紋理元素格式。對於深度/模板緩沖區,必須為以下格式之一:DXGI_FORMAT_D32_FLOAT_S8X24_UINT:32位浮點深度緩沖區。為模板緩沖區預留8位(無符號整型),每個模板值取值為[0,255],其余24位閑置。
DXGI_FORMAT_D32_FLOAT:32位浮點深度緩沖區。
DXGI_FORMAT_D24_UNORM_S8_UINT:無符號24位深度緩沖區,每個深度值取值為[0,1]。為模板緩沖區預留8位(無符號整型),每個模板值取值為[0,255]。
DXGI_FORMAT_D16_UNORM:無符號16位深度緩沖區,每個深度值取值為[0,1]。
SampleDesc:多重采樣描述結構體。成為Count指定多重采樣的數量,Quality指定圖像質量級別。
Usage:表示紋理用途的D3D10_USAGE枚舉類型成員,其枚舉如下:
1 typedef enum D3D10_USAGE 2 { 3 D3D10_USAGE_DEFAULT = 0, 4 D3D10_USAGE_IMMUTABLE = 1, 5 D3D10_USAGE_DYNAMIC = 2, 6 D3D10_USAGE_STAGING = 3 7 }D3D10_USAGE;
D3D10_USAGE_DEFAULT:表示 GPU會對資源執行讀寫操作。CPU不能讀寫這種資源。對於深度/模板緩沖區,使用該標志值,因為GPU會不斷地執行讀寫深度/模板緩沖區的操作。
D3D10_USAGE_IMMUTABLE:表示在資源創建后,資源中的數據內容不會改變。可獲得一些內部優化,因為GPU 會以只讀方式訪問這種資源。除了在創建資源時CPU會寫入初始化數據外,其他任何時候CPU都不會對這種資源執行任何讀寫操作。
D3D10_USAGE_DYNAMIC:表示CPU會頻繁更新資源中的數據。GPU可以從資源中讀取數據,而CPU可以向其寫入數據。
D3D10_USAGE_STAGING:表示CPU會讀取該資源的一個副本,即使得該資源支持從顯存到系統內存的數據復制。
BindFlags:指定該資源將會綁定到管線的哪個階段的D3D10_BIND_FLAG枚舉成員,可用位或運算符組合多個標志值。其枚舉如下:
1 typedef enum D3D10_BIND_FLAG 2 { 3 D3D10_BIND_VERTEX_BUFFER = 0x1L, 4 D3D10_BIND_INDEX_BUFFER = 0x2L, 5 D3D10_BIND_CONSTANT_BUFFER = 0x4L, 6 D3D10_BIND_SHADER_RESOURCE = 0x8L, 7 D3D10_BIND_STREAM_OUTPUT = 0x10L, 8 D3D10_BIND_RENDER_TARGET = 0x20L, 9 D3D10_BIND_DEPTH_STENCIL = 0x40L 10 }D3D10_BIND_FLAG;
D3D10_BIND_SHADER_RESOURCE:將紋理作為一個着色器資源綁定到管線上。
D3D10_BIND_RENDER_TARGET:將紋理作為一個渲染目標綁定到管線上。
D3D10_BIND_DEPTH_STENCIL:將紋理作為一個深度/模板緩沖區綁定到管線上。
CPUAccessFlags:指定CPU對資源的訪問權限的D3D10_CPU_ACCESS_FLAG枚舉成員。對於深度/模板緩沖區,只有GPU會進行讀寫,CPU不會在該緩沖區執行讀寫,故設該參數為空。D3D10_CPU_ACCESS_FLAG枚舉如下:
1 typedef enum D3D10_RESOURCE_MISC_FLAG 2 { 3 D3D10_RESOURCE_MISC_GENERATE_MIPS = 0x1L, 4 D3D10_RESOURCE_MISC_SHARED = 0x2L, 5 D3D10_RESOURCE_MISC_TEXTURECUBE = 0x4L, 6 D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX = 0x10L, 7 D3D10_RESOURCE_MISC_GDI_COMPATIBLE = 0x20L 8 }D3D10_RESOURCE_MISC_FLAG;
D3D10_CPU_ACCESS_WRITE:若CPU需向資源寫入數據,則應指定為該標志值。具有寫訪問權限的資源的 Usage參數應設為D3D10_USAGE_DYNAMIC或D3D10_USAGE_STAGING。
D3D10_CPU_ACCESS_READ:若CPU需從資源讀取數據,則應指定為該標志值。具有讀訪問權限的資源的Usage 參數應設為D3D10_USAGE_STAGING。
MiscFlags:可選的一個D3D10_RESOURCE_MISC_FLAG枚舉成員。與深度/模板緩沖區無關,所以設為空。其枚舉如下:
1 typedef enum D3D10_RESOURCE_MISC_FLAG 2 { 3 D3D10_RESOURCE_MISC_GENERATE_MIPS = 0x1L, 4 D3D10_RESOURCE_MISC_SHARED = 0x2L, 5 D3D10_RESOURCE_MISC_TEXTURECUBE = 0x4L, 6 D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX = 0x10L, 7 D3D10_RESOURCE_MISC_GDI_COMPATIBLE = 0x20L 8 }D3D10_RESOURCE_MISC_FLAG;
填充作為深度/模板緩沖區的紋理結構體示例:
1 //深度/模板緩沖區描述 2 D3D10_TEXTURE2D_DESC DepthStencilDesc; 3 4 //寬度、高度 5 DepthStencilDesc.Width = ClientWidth; 6 DepthStencilDesc.Height = ClientHeight; 7 8 //紋理元素格式 9 DepthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 10 11 //紋理數量 12 DepthStencilDesc.ArraySize = 1; 13 14 //多級漸進紋理層數量 15 DepthStencilDesc.MipLevels = 1; 16 17 //多重采樣 18 DepthStencilDesc.SampleDesc.Count = 1; 19 DepthStencilDesc.SampleDesc.Quality = 0; 20 21 //紋理用途 22 DepthStencilDesc.Usage = D3D10_USAGE_DEFAULT; 23 24 //CPU對資源訪問權限 25 DepthStencilDesc.CPUAccessFlags = NULL; 26 27 //管線綁定標志值 28 DepthStencilDesc.BindFlags = D3D10_BIND_DEPTH_STENCIL; 29 30 //與深度/模板無關的一個標志值 31 DepthStencilDesc.MiscFlags = NULL;
使用深度/模板緩沖區之前,還需創建其視圖,過程與創建渲染目標視圖相似。
使用方法ID3D10Device::CreateTexture2D創建深度/模板緩沖區。
1 HRESULT ID3D10Device::CreateTexture2D( 2 const D3D10_TEXTURE2D_DESC *pDesc, 3 const D3D10_SUBRESOURCE_DATA *pInitialData, 4 D3D10Texture2D **ppTexture2D);
pDesc:指向前面填充的D3D10_TEXTURE2D_DESC結構體的指針。
pInitialData:指向初始化數據的指針,這些數據用於填充紋理。對於深度/模板緩沖區,由於在執行深度緩存和模板操作時,Direct3D會自動向該緩沖區寫入數據,故將該參數設為空值。
ppTexture2D:指向創建后所要返回的深度/模板緩沖區的指針。
使用與ID3D10Device::CreateDepthStencilView創建深度/模板緩沖區視圖。
1 HRESULT CreateDepthStencilView( 2 ID3D10Resource *pResource, 3 const D3D10_DEPTH_STENCIL_VIEW_DESC *pDesc, 4 ID3D10DepthStencilView **ppDepthStencilView);
pResource:指定將要作為深度/模板緩沖區的資源。
pDesc:指向D3D10_RENDER_TARGET_VIEW_DESC結構體的指針,該結構體描述渲染目標即參數pResource所指定的資源中的元素的數據類型。如果創建資源時使用強類型,則可為空,表示以資源自身格式為視圖格式。
ppDepthStencilView:指向創建后所要返回的深度/模板緩沖區對象的指針。
創建深度/模板緩沖區及其視圖示例:
1 //創建深度/模板緩沖區及其視圖 2 ID3D10Texture2D* pDepthStencilBuffer; 3 ID3D10DepthStencilView* pDepthStencilView; 4 pd3dDevice->CreateTexture2D(&DepthStencilDesc, nullptr, &pDepthStencilBuffer); 5 pd3dDevice->CreateDepthStencilView(pDepthStencilBuffer, nullptr, &pDepthStencilView);
5.將視圖綁定到輸出合並器階段
為后台緩沖區和深度/模板緩沖區創建視圖后,使用ID3D10Device::OMSetRenderTargets方法將視圖綁定到管線輸出合並階段,使這些資源成為管線的渲染目標和深度/模板緩沖區。
1 void ID3D10Device::OMSetRenderTargets( 2 UINT NumViews, 3 ID3D10RenderTargetView *const *ppRenderTargetViews, 4 ID3D10DepthStencilView *pDepthStencilView);
NumViews:將要綁定的渲染目標數量。
ppRenderTargetViews:指向將要綁定的渲染目標視圖數組的首元素的指針。
pDepthStencilView:指向將要綁定的深度/模板視圖。
將視圖綁定到管線示例:
1 //綁定視圖到輸出合並器階段 2 pd3dDevice->OMSetRenderTargets(1, &pRenderTargetView, pDepthStencilView);
6.設置視口
通常3D場景將會渲染到整個后台緩沖區,通過提交給前台緩沖區后,把圖像布滿整個客戶窗口區。
若只希望將場景渲染到一個子矩形區域中,而非布滿整個緩沖區,則可以通過修改視口來實現。
后台緩沖區的子矩形區域稱為視口,以下面的結構體描述:
1 typedef struct D3D10_VIEWPORT 2 { 3 INT TopLeftX; 4 INT TopLeftY; 5 UINT Width; 6 UINT Height; 7 FLOAT MinDepth; 8 FLOAT MaxDepth; 9 }D3D10_VIEWPORT;
TopLeftX:相對於窗口客戶區左上角的橫坐標,最左上角的第一個像素點橫坐標為0像素。
TopLeftY:相對於窗口客戶區左上角的縱坐標,最左上角的第一個像素點縱坐標為0像素。
Width:子矩形區域寬度。
Height:子矩形高度。
MinDepth:深度緩沖區最小值,由於Direct3D的深度緩沖區取值為[0,1],因此通常取為0。
MaxDepth:深度緩沖區最大值,由於Direct3D的深度緩沖區取值為[0,1],因此通常取為1。
填充完D3D10_VIEWPORT結構體后,使用ID3D10Device::RSSetViewports設置視口。
1 void ID3D10Device::RSSetViewports( 2 UINT NumViewports, 3 const D3D10_VIEWPORT *pViewports);
NumViewports:視口數量。
pViewports:指向進行設置的視口的指針。
視口設置示例:
1 //視口設置 2 3 //填充視口 4 D3D10_VIEWPORT vp; 5 vp.TopLeftX = 0; 6 vp.TopLeftY = 0; 7 vp.Width = ClientWidth; 8 vp.Height = ClientHeight; 9 vp.MinDepth = 0.0f; 10 vp.MaxDepth = 1.0f; 11 12 //設置視口 13 pd3dDevice->RSSetViewports(1, &vp);