本篇将简单整理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);