directX 创建交换链

2024-02-29

在我的书中,我编写了创建交换链的代码。

IDXGIDevice * dxgiDevice = 0;
mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );

IDXGIAdapter * dxgiAdapter = 0;
dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );

IDXGIFactory * dxgiFactory = 0;
dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );

dxgiFactory->CreateSwapChain( mD3dDevice, & sd, & mSwapChain );

对于这段代码没有解释,我查了几本书,也没有对此代码的解释。

请帮助我解决这个问题。 我真的不明白 GetParent 方法在做什么。 idxgiDevice 扩展 idxgiObject。 idxgiDevice 的父级是 idxgiObject,为什么他们使用指向 idxgiFacory 的指针作为参数。

我不知道我是否理解 queryInterface 好

请帮助我解决这个问题


此代码用于使用 DirectX 11 或更高版本的接口创建交换链,此模式专门设计用于确保您使用的 DXGI 工厂实例是创建 Direct3D 11 设备时实际使用的实例。

基本上,当您第一次创建 Direct3D 11 设备时,您可以选择提供IDXGIAdapter要使用的实例。大多数人都通过nullptr or NULL在这里,让它在系统中的默认适配器上创建一个设备。但是,要完成交换链的设置,您需要 DXGI 工厂实例。理论上你可以使用自己创建一个DXGICreateFactory1但你很容易搞砸并通过使用得到“错误的”DXGICreateFactory或者可能DXGICreateFactory2带有错误的标志。

相反,最安全的做法是获取IDXGIDevice从你的ID3D11Device使用标准COMIUnknown::查询接口 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682521.aspx:

IDXGIDevice * dxgiDevice = 0;
HRESULT hr = mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );
if ( SUCCEEDED(hr) )

然后得到IDXGIAdapter来自IDXGIDevice using IDXGIObject::GetParent http://msdn.microsoft.com/en-us/library/windows/desktop/bb174542.aspx:

IDXGIAdapter * dxgiAdapter = 0;
hr = dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );
if ( SUCCEEDED(hr) )

然后得到IDXGIFactory来自IDXGIAdapter using IDXGIObject::GetParent http://msdn.microsoft.com/en-us/library/windows/desktop/bb174542.aspx again:

IDXGIFactory * dxgiFactory = 0;
hr = dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );
if ( SUCCEEDED(hr) )

现在你拥有了IDXGIFactory与您的 Direct3D 11 设备关联,无论它是如何创建的。请记住,COM 引用计数意味着您现在必须清理对所有这些对象的引用:

dxgiFactory->Release();
dxgiAdapter->Release();
dxgiDevice->Release();

注意IDXGIFactory::CreateSwapChain是 DirectX 11.0 创建交换链的方式,如果您使用过,您会得到基本相同的结果D3D11创建设备和交换链 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476083.aspx而不是D3D11创建设备 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082.aspx首先。对于 DirectX 11.1 或更高版本的系统,您可以考虑使用IDXGIFactory2::CreateSwapChainForHwnd而用于 Win32 桌面应用程序。对于 Windows 应用商店应用程序、Windows Phone 8 和 Xbox One,您始终使用IDXGIFactory2::CreateSwapChainForCoreWindow.

对于 Win32 桌面应用程序,您可以按照上面的代码执行以下操作:

IDXGIFactory2* dxgiFactory2 = 0;
hr = dxgiFactory->QueryInterface( __uuidof(IDXGIFactory2), reinterpret_cast<void**>(&dxgiFactory2) );
if ( SUCCEEDED(hr) )
{
    // This system has DirectX 11.1 or later installed, so we can use this interface
    dxgiFactory2->CreateSwapChainForHwnd( /* parameters */ );
    dxgiFactory2->Release();
}
else
{
    // This system only has DirectX 11.0 installed
     dxgiFactory->CreateSwapChain( /* parameters */ );
}

See Direct3D 11 创建设备剖析 https://walbourn.github.io/anatomy-of-direct3d-11-create-device/以及 Direct3D 教程示例Win32桌面应用程序版本 https://github.com/walbourn/directx-sdk-samples/tree/master/Direct3D11Tutorials.

DirectX12 的使用明确禁止此代码模式。有关更多详细信息,请参阅这篇博文 https://walbourn.github.io/anatomy-of-direct3d-12-create-device/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

directX 创建交换链 的相关文章

随机推荐

  • 如何在 WP7 中访问播客?

    如何访问手机上的播客列表并在 WP7 中播放它们 Thanks 目前无法查询播客 流派不会告诉您正在使用的内容是否是播客 MediaLibrary 将仅访问常规歌曲 而不是其他内容 希望 Mango 更新能够为媒体访问 API 带来一些扩展
  • 匹配第一个和最后一个字符的正则表达式

    我正在尝试使用正则表达式来检查字符串中的第一个和最后一个字符是否是 a z 之间的字母字符 我知道这与第一个字符匹配 a z i 但是我如何检查最后一个字符呢 This a z a z i 不起作用 我怀疑这两个子句之间应该有一些东西 但我
  • MIPS汇编将整数转换为二进制并读取1的数量?

    我正在开发一个程序 它从用户那里获取一个整数 然后输出它的二进制等价物中有多少个 1 所以首先我认为我需要将其转换为二进制 然后使用循环检查所有 32 位以找出有多少个 1 我已经浏览了几个小时并尝试不同的方法来首先将整数转换为二进制 最好
  • 如何使用 React DatePicker 选择时间

    我在用着反应日期选择器 https github com Hacker0x01 react datepicker我还需要包括选择日期的时间 我没有从文档中找到任何如何实现这一点的示例 DatePicker 是否提供了任何开箱即用的功能 还是
  • 从批处理文件执行存储过程

    如何从批处理文件执行 SQL Server 中的存储过程 使用 Windows 身份验证 如果您使用的是 Sql Server 2005 则可以使用sqlcmd http msdn microsoft com en us library m
  • SwiftUI 简化许多文本字段的 .onChange 修饰符

    我正在寻找一种方法来简化 重构 SwiftUI 中添加 onChange of 具有许多文本字段的视图 如果解决方案简洁 我也会移动修饰符 更接近适当的字段 而不是位于 ScrollView 的末尾 在这个 在这种情况下 所有 onChan
  • NuxtJS 上的 ESLint 和 Prettier 冲突

    当我创建一个新的 Nuxt js 项目时 我遇到了 ESLint 和 Prettier 的一个非常令人筋疲力尽的问题 如果我节省这个 vue文件中 Prettier 尝试修复它 但 ESLint 阻止它这样做 所以 我无法删除这方面的错误
  • 拖动进入时突出显示按钮

    刚刚开始探索iOS SDK 我有一些按钮 需要突出显示它们 触摸一次然后拖动 据我了解 当您单击按钮然后拖动到外部然后再次拖动到内部时 会触发 TouchDragEnter 事件 当您单击按钮外部然后拖动到内部时 是否会触发任何事件 亚历山
  • 数据注释、IDataErrorInfo 和 MVVM

    我正在尝试找到验证 MVVM 中数据的最佳方法 目前 我正在尝试使用 MVVM 模式将 IDataErrorInfo 与数据注释结合使用 然而 似乎没有任何作用 我不确定我可能做错了什么 我有这样的东西 Model public class
  • 使用 numpy/scipy 的快速 B 样条算法

    我需要在 python 中计算 bspline 曲线 我研究了 scipy interpolate splprep 和其他一些 scipy 模块 但找不到任何可以轻松满足我需要的东西 所以我在下面编写了自己的模块 代码运行良好 但速度很慢
  • 如何保护 web.config 中存储的密码的安全?

    我在 web config 文件中添加了以下设置 以启动对外部系统的 API 调用 因此 我存储 API URL 用户名 密码 如下所示
  • 包含 MySQL 查询结果中未找到的值

    我有以下 MySQL 表 tbl pet owners id name pet city date adopted 1 jane cat Boston 2017 07 11 2 jane dog Boston 2017 07 11 3 ja
  • cygwin中如何杀死进程?

    您好 我有以下无法杀死的进程 我在 windows xp 32 位中运行 cygwin 我尝试发出以下命令 bin kill f 4760 bin kill 9 5000 kill 9 5000 kill 5000 当我写 bin kill
  • 如何在 .net 中获取可用的 wifi AP 及其信号强度?

    有没有办法使用 NET 访问所有 WiFi 接入点及其各自的 RSSI 值 如果我可以在不使用非托管代码的情况下完成它 那就太好了 或者如果它可以在 Mono 和 NET 中工作 那就更好了 如果可能的话 我将不胜感激代码示例 谢谢 以下是
  • 使用隐藏代码的 nbextensions 时查找并转到文本

    这是来自的重复this https stackoverflow com questions 530245473年前的问题 目前还没有令人满意的解决方案 问题是在使用 nbextensions 时 在 Jupyter Notebook 的所有
  • 虚拟机上奇怪的程序延迟行为

    我编写了一个程序来读取 256KB 数组以获得 1 毫秒的延迟 该程序非常简单并附带 然而 当我在Xen上的VM上运行它时 我发现延迟不稳定 它具有以下模式 时间单位是ms totalCycle CyclePerLine totalms 2
  • 使用 MySQLi 插入 NULL 而不是空值

    我有一个带有一些可选字段的表单 在数据库中 这些字段设置为接受 NULL 如果某些字段为空 下面的代码将引发错误 您能帮忙看看避免这种情况的最佳方法是什么吗 我想到的唯一解决方案是将变量设置为 if isempty query INSERT
  • 从无符号整数中减去有符号整数[重复]

    这个问题在这里已经有答案了 unsigned int value 1860 int data 1300 if data value gt 0 printf Why it is printing this 输出 为什么打印这个 我不明白为什么
  • linux gcc 链接器与 C 程序的问题

    我正在尝试编译一个包含 c 文件标头的 C 程序 但只有 1 个 c 文件真正使用了头文件中定义的变量 这是一些会产生链接器问题的示例代码 我试图让我的头文件包含 2 使用的全局变量 不同的 c 文件 任何类型的帮助将不胜感激 谢谢 tmp
  • directX 创建交换链

    在我的书中 我编写了创建交换链的代码 IDXGIDevice dxgiDevice 0 mD3dDevice gt QueryInterface uuidof IDXGIDevice void dxgiDevice IDXGIAdapter