DirectX 11 编程指南 - Direct3D Device 简介

DirectX 11 编程指南 - Direct3D Device 简介
 

在D3D API 中, Device(设备)是一个核心的概念,Device是对一个图形硬件的抽象,它负责创建和销毁其他的对象,渲染图元等功能。D3D11中,Device对象主要用来管理资源,而DeviceContext对象执行渲染操作。一个对象只能被创建它的Device使用。多个Device可以通过共享资源来共享数据,但这个共享的资源也只能在创建它的Device内使用。(意思就是说多个Device都可以访问共享对象里面的数据,但处了创建Device之外,其他Device不能直接把这个资源连接到渲染管线上使用)

每个Device都由一个ID3D11Device接口来代表,可以通过D3D11CreateDevice或者D3D11CreateDeviceAndSwapChain函数来创建这个接口。每个Device都可以使用一个或多个DeviceContext,这主要是用来支持多线程操作。

D3D11CreateDevice函数的原型如下:

HRESULT D3D11CreateDevice(IDXGIAdapter *pAdapter,D3D_DRIVER_TYPEDriverType,HMODULESoftware,UINTFlags,CONST D3D_FEATURE_LEVEL *pFeatureLevels,UINTFeatureLevels,UINTSDKVersion,ID3D11Device **ppDevice,D3D_FEATURE_LEVEL *pFeatureLevel,ID3D11DeviceContext **ppImmediateContext);

参数解析:

IDXGIAdapter *pAdapter:显示适配器接口。表示要创建的Device与这个适配器硬件对应。一台电脑上可能安装多个显示适配器(即显卡),可以使用IDXGIFactory::EnumAdapters函数来遍历所有的适配器。传入NULL的话就表示使用默认的适配器(你的电脑上至少应该有一个显卡吧)。

D3D_DRIVER_TYPEDriverType:创建的Device的类型。可能的值有:

  • D3D_DRIVER_TYPE_UNKNOWN: 未知类型,创建设备时不能使用
  • D3D_DRIVER_TYPE_HARDWARE:硬件设备,指使用硬件来实现D3D的功能。它使用硬件来加速D3D功能,并用软件实现硬件不支持的部分,因此能提供最好的性能。这一种设备类型通常都用一个HAL(Hardware Abstraction Layer,硬件抽象层)来代表。
  • D3D_DRIVER_TYPE_REFERENCE:参考设备,即使用软件(CPU上运行)来实现D3D的所有功能。参考设备注重功能的准确性而不保证速度。因此主要用来做功能的测试、演示与调试等。参考设备由DirectXSDK提供(D3D11Ref.dll ?)。这个设备通常叫做REF Device或Reference rasterizer(光栅器)
  • D3D_DRIVER_TYPE_NULL:空设备,即不提供D3D渲染功能的设备,它主要用来测试一些非测试的API的功能。它也是由DirectXSDK提供。
  • D3D_DRIVER_TYPE_SOFTWARE:  软件渲染器,也是由软件实现D3D的所有功能。这个渲染器必须由用户自己实现,并通过一个DLL提供。
  • D3D_DRIVER_TYPE_WARP: Windows Advanced Resterization Platform。一个高性能的软件光栅器。提供特性集9.1到10.1的支持。

HMODULESoftware:软件渲染器DLL,如果不用软件渲染器的话,传入NULL

UINTFlags:创建标记,这写标记主要用来控制创建的Device中的层次,这些标记可以按位与操作。如果不特别指定的话,传入0。  D3D11_CREATE_DEVICE_FLAG 的取值有:

  • D3D11_CREATE_DEVICE_SINGLETHREADED = 0x1,  设置Device为单线程使用。D3D11默认是支持多线程使用的,即在每个API的调用中都会进行锁保护。如果确定不会在多线程环境中使用,则设置该标记,则不会进行锁保护,这样可以提高性能。
  • D3D11_CREATE_DEVICE_DEBUG = 0x2,  让Device支持调试层
  • D3D11_CREATE_DEVICE_SWITCH_TO_REF = 0x4,  同时创建REF和HAL设备,这样就可以在运行时进行切换,以支持调试功能。
  • D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS = 0x8,  阻止创建多线程(这个需要深入了解)
  • D3D11_CREATE_DEVICE_BGRA_SUPPORT = 0x20, 在允许D2D与D3D互操作时设置

CONST D3D_FEATURE_LEVEL *pFeatureLevels, UINTFeatureLevels:指向一组特征集。创建函数会按顺序尝试这些特征集,并选择第一个能支持的特征集。传入NULL的话,则会依次尝试从高到低(SM5->SM2)的所有特征集。  特征集的可选项有:

  • D3D_FEATURE_LEVEL_9_1 = 0x9100,   SM2
  • D3D_FEATURE_LEVEL_9_2 = 0x9200,   SM2
  • D3D_FEATURE_LEVEL_9_3 = 0x9300,    SM3
  • D3D_FEATURE_LEVEL_10_0 = 0xa000,    SM4
  • D3D_FEATURE_LEVEL_10_1 = 0xa100,    SM4
  • D3D_FEATURE_LEVEL_11_0 = 0xb000,    SM5

UINTSDKVersion: SDK版本,传入D3D11_SDK_VERSION,这是由SDK设置的一个常数

ID3D11Device **ppDevice,D3D_FEATURE_LEVEL *pFeatureLevel,ID3D11DeviceContext **ppImmediateContext  三个返回值,返回创建的Device,立即DeviceContext及当前的特征集。

Device Context 包含了Device的环境或设置。更精确地说,DeviceContext用来设置渲染状态,产生渲染命令,并使用资源。D3D11实现了两种Context,一种是立即渲染(immediate rendering),一种是延迟渲染(deferred rendering)。它们都由ID3D11DeviceContext接口代表。每个线程只能有一个Context,一般主线程拥有立即Context,用于渲染,其他工作线程拥有延迟Context。

一个Device有且只有一个立即Context,它用来直接绘制到硬件,它能够从GPU获取数据,也可以用来立即执行(或回放)一个命令列表。立即Context可以在创建Device时获取,也可以通过ID3D11Device::GetImmediateContext()接口获取。

延迟Context将GPU命令记录到命令列表之中。它主要用来在主线程之外记录渲染命令。创建延迟Context时将不会继承任何的立即Context的状态。延迟Context通过ID3D11Device::CreateDeferredContext()接口创建。

ID3D11Device接口函数都是线程安全的,但ID3D11DeviceContext接口不是线程安全的,即必须只能在一个线程内进行调用。这区别于ID3D10Device接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《DirectX 11 3D 游戏编程介绍》是一本探索使用DirectX 11进行3D游戏编程的入门指南。作者在书中详细介绍了使用DirectX 11构建高性能、交互性强的3D游戏的基本原理和技术。 这本书首先向读者介绍了DirectX 11的基本知识,包括如何安装和配置DirectX 11开发环境,以及如何使用DirectX 11的各种工具和函数编写3D游戏程序。接着,作者解释了3D计算机图形学的基础知识,如顶点和像素着色器、纹理贴图和辐射衰减等。通过这些基础知识的介绍,读者可以快速掌握构建3D游戏所需的关键技术。 在介绍了基本概念之后,书中详细介绍了使用DirectX 11来创建各种类型的3D游戏元素,如物体、相机、光照等。通过丰富的示例代码和图文并茂的解释,读者可以了解到如何创建和渲染一个真实感十足的3D场景。 除了基本的游戏元素之外,本书还涵盖了一些高级主题,如阴影、环境映射以及粒子系统等。这些高级技术的介绍,使读者能够在游戏中添加更多的特效和细节,提高游戏的表现力和吸引力。 总之,《DirectX 11 3D 游戏编程介绍》是一本全面而深入的指南,适合对DirectX 11编程感兴趣的读者。通过阅读本书,读者可以快速掌握使用DirectX 11构建3D游戏所需的基本知识和技术,为自己的游戏编程之路打下坚实的基础。 ### 回答2: 《DirectX 11 3D游戏编程入门》是一本介绍使用DirectX 11进行3D游戏编程的书籍。这本书深入探讨了如何使用DirectX 11框架来创建高质量的游戏图形和动画效果。 首先,书中介绍了DirectX 11的基本原理和概念,包括DirectX API、3D渲染管线以及基本的数学知识。读者将学习如何使用DirectX 11的各个组件来创建并控制游戏世界的各个方面,包括场景、模型、光照、纹理和动画等。 其次,书中还涵盖了一些高级主题,如几何处理、阴影技术和物理仿真。通过学习这些技术,读者将能够创建更加真实和逼真的游戏效果。 除了理论知识,这本书还提供了大量的实际编程示例和练习,帮助读者巩固所学的内容。读者将通过实践性的编程项目来运用所学知识,提高自己的编程能力和理解。书中的示例代码和项目都是使用C++语言编写的,读者需要基本的C++编程知识。 总而言之,《DirectX 11 3D游戏编程入门》是一本全面介绍使用DirectX 11进行游戏编程的教材。无论是对于初学者还是已有一定游戏开发经验的读者来说,都是一本不可或缺的学习资源。通过学习这本书,读者将能够掌握使用DirectX 11创建引人入胜的3D游戏的技能。 ### 回答3: 《DirectX 11 3D游戏编程入门》是一本介绍使用DirectX 11进行3D游戏编程的入门教材。DirectX 11是微软的一个图形编程接口,它提供了丰富的功能和工具,方便开发者实现高性能、逼真的图形效果。 本书首先介绍了计算机图形学的基础知识,如顶点、三角形、光照、材质等。然后详细介绍了DirectX 11的各个组件和功能,如绘制2D图形、创建3D模型、使用着色器编程、应用纹理和光照效果等。 书中通过一系列具体的示例代码和案例,手把手地教读者如何使用DirectX 11进行游戏编程。读者可以学会如何加载模型、设置相机视角、实现场景渲染等基本功能。同时,本书还介绍了一些高级的特效技术,如阴影和反射效果的实现。 在学习过程中,本书鼓励读者动手实践,通过编写自己的游戏项目来巩固所学知识。此外,本书还提供了一些调试技巧和最佳实践,帮助读者解决常见的问题,并编写出高效、稳定的游戏程序。 总之,《DirectX 11 3D游戏编程入门》是一本系统、全面介绍DirectX 11游戏编程的教材,适合有一定编程基础和对3D游戏开发感兴趣的读者阅读。通过学习本书,读者可以了解DirectX 11的核心概念和基本功能,掌握基于DirectX 11的3D游戏开发技巧,为进一步深入学习和开发打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值