Direct3D 10學習筆記(一)——初始化


本篇將簡單整理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);

 

 

  

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM