问题标签 [dxgi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
244 浏览

directx-11 - ReportLiveObjects 以编程方式获取日志

我的应用程序使用 IDXGIDebug::ReportLiveObjects 报告一些内存泄漏。但我想通过我自己的日志系统管道这些日志。

我在网上找不到太多信息。除了查看 Visual Studio 输出窗口之外,任何人都知道我如何以编程方式访问这些 DXGI 日志。

0 投票
1 回答
594 浏览

directx-11 - 将交换链切换到窗口模式

我需要释放交换链,但看起来需要将其放回窗口模式。

DXGI 错误:IDXGISwapChain::Release:Swapchain 在全屏时发布。先把它切换到窗口状态。[杂项错误#66:]

任何人都知道完成此任务的最简单方法吗?

0 投票
2 回答
2695 浏览

c++ - 了解 DXGI DirectX 11 桌面复制以获取缓冲区或数组的问题

我想了解 DXGI 桌面复制。我已经阅读了很多,这是我从 Microsoft 网站上的 DesktopDuplication 示例中复制的代码。我的计划是从 DesktopImage 中获取缓冲区或数组,因为我想为其他程序制作新的纹理。我希望有人能解释我该怎么做才能得到它。

0 投票
0 回答
1167 浏览

direct3d11 - 处理多个图形适配器和监视器

我正在尝试决定是否在我的应用程序中支持多个适配器/监视器,而不是将我的窗口锁定到主适配器和主监视器。我对此有很多疑问,因为我从未使用过具有多个显卡的系统。

当存在多个图形卡时,Windows 桌面的行为如何?如果两张卡都运行自己的一组监视器,是否可以在一张卡的监视器和另一张卡的监视器之间拖动一个窗口?如果是这样,在这种情况下,我的 Direct3D 11 上下文将使用什么卡?

DXGI 的抽象如何与 Crossfire/SLI 中的卡和未使用的卡一起工作?

当存在多个监视器时,Windows 如何处理 VSync?

什么决定了哪个图形适配器被视为主适配器?

我敢肯定还有更多我不知道要问的相关信息,因此任何有关此的额外信息也会有所帮助。

0 投票
1 回答
3166 浏览

c++ - C++ 和 directx 11 错误没有为 dxgi.dll 加载符号

几天前我开始学习 c++ 和 directx11。

所以我不是这方面的专家。.请好心解释一下为什么会发生...我正确地创建了窗口和东西。即使交换链初始化也按预期进行。但我被困在渲染目标视图初始化...

当我调试时,它会给我以下错误

我不知道我在这里做错了什么。我已经包含了静态库(dxgi.lib d3dx11.lib d3d11.lib dxguid.lib D3DCompiler.lib)并正确链接了头文件和库。

错误似乎来自这一行

我不知道该怎么办..这让我真的很沮丧。

请在这里帮助我..我将非常感谢

谢谢

这是完整的代码

0 投票
1 回答
2048 浏览

c++ - 在 Present() 钩子中绘制而不破坏现有内容

我正在为 DX11 全屏应用程序编写一个通用覆盖应用程序(不是作弊器)。
我是 DX11 的新手,并且由于项目的时间压力而努力赶上进度。希望得到您的帮助。

我正在注入一个 dll 并连接 DX11 Present(),它似乎工作得很好。
使用 Present() 中的交换链,我可以获得窗口处理程序、设备和上下文。

我缺乏很多理解,试图通过现有的代码、教程和文档爬行。我目前的方法是演示“叠加”,我想绘制一个三角形并将其叠加在现有场景上。
现在我似乎删除了所有现有的东西而不是覆盖。

我的第一个目标是覆盖一个简单的矩形框并在其上添加现有图像作为纹理。任何有关该目标的帮助将不胜感激。

这是我当前的演示覆盖函数,它在 Present() 挂钩中被调用。DX11 对象是一个包含我从 Present() 交换链(游戏交换链)收集的东西的结构。

我究竟做错了什么 ?考虑到我在游戏已经准备好一切之后才注入此功能,我想我犯了不止一个错误。
我应该使用游戏中的交换链吗?创建自己的第二个?
我有点(很多)迷失了。

0 投票
1 回答
850 浏览

windows - 从 IDXGIOutput.GetDisplayModeList 返回的模式列表中的 DXGI_MODE_SCALING_UNSPECIFIED 缩放模式是什么意思?

我正在尝试创建支持全屏模式的 Direct3D 10/11 应用程序。为此,我必须向用户提供可用视频模式的列表。此外,最好选择当前桌面设置作为默认视频模式,以最大程度地减少视频模式更改。

在 Direct3D 9 中执行此操作非常简单。例如,这是我的模式列表,由 Direct3D 9 提供:

但是通过 DXGI 做同样简单的事情有点复杂。最让我困惑的是,IDXGIOutpit.GetDisplayModeList方法最多返回 3 个相同视频模式的副本。不同之处在于提供的缩放模式:

这里是:

首先我想,DXGI_MODE_SCALING_STRETCHED = 这个模式需要拉伸(后缓冲区小,然后前一个,分辨率可能不是物理的),DXGI_MODE_SCALING_CENTERED = 在这个模式下图像可能不会占据整个屏幕(后缓冲区小,然后前一个,但保留物理分辨率),DXGI_MODE_SCALING_UNSPECIFIED = "正常模式"(前后缓冲区大小匹配,但不保证物理分辨率)。即我应该只列出那些具有 Scaling = DXGI_MODE_SCALING_UNSPECIFIED 的模式。

但后来我试图确定当前模式。根据 MSDN,当使用IDXGIOutput.FindClosestMatchingMode方法时,如果您未指定其中一个参数,则此方法会倾向于当前桌面设置,优先考虑已设置的参数并使用某种优先级(ScanlineOrdering>Scaling>Format> Resolution>RefreshRate) 来选择其他的。所以我创建了设备(为了能够将格式指定为 DXGI_FORMAT_UNKNOWN)并将完全未确定的模式传递给此方法(包括 Scaling = DXGI_MODE_SCALING_UNSPECIFIED)。

结果如下:

如您所见,它与当前的桌面模式(即 1920x1080x60Hz)不匹配。我尝试将当前桌面模式更改为不同的模式并发现,IDXGIOutput.FindClosestMatchingMode倾向于选择最接近的可用模式,其参数接近桌面参数,但使用 Scaling = DXGI_MODE_SCALING_STRETCHED,只需忽略 Scaling = DXGI_MODE_SCALING_UNSPECIFIED,由我。

这使我得出了一个惊人的结论,至少对于IDXGIFactory.CreateSwapChain方法,DXGI_MODE_SCALING_UNSPECIFIED 被视为 Scaling 参数的无效值(否则为什么IDXGIOutput.FindClosestMatchingMode用于选择模式,在大多数情况下将提供给IDXGIFactory.CreateSwapChain,拒绝选择1920x1080x60Hz?)。

我猜IDXGIFactory.CreateSwapChain甚至在内部调用IDXGIOutput.FindClosestMatchingMode来确定使用哪种“物理”模式。但是……那是什么意思?我无法提供没有 Scaling = DXGI_MODE_SCALING_CENTERED 或 DXGI_MODE_SCALING_STRETCHED 给用户的模式,因为这种模式不是“物理”模式 - 即IDXGIFactory.CreateSwapChain无论如何都会选择其他模式?

但是为什么 DXGI_MODE_SCALING_UNSPECIFIED 在可用模式列表中返回呢?如果仅在调用IDXGIFactory.CreateSwapChain方法时使用缩放参数来指定我要居中图像还是缩放它,如果提供的模式不匹配任何“物理”模式并且在调用IDXGISwapChain.ResizeTarget时未使用,因为此方法需要“仅物理”模式,那么为什么缩放参数混合在一个列表中,由IDXGIOutpit.GetDisplayModeList返回?

我应该向用户展示哪些模式?只有那些,有缩放<> DXGI_MODE_SCALING_UNSPECIFIED?还是我应该做相反的事情?以及如何通过 DXGI 本身确定当前模式,而不是使用传统的 Win API?

谁能给我解释一下?因为在 MSDN 中没有任何澄清。

0 投票
2 回答
1095 浏览

c++ - DXGI EnumOutputs - 没有 DXGI_OUTPUT_DESC 和空显示模式数组

尝试获取可用的显示模式时遇到了奇怪的问题。让我解释...

首先,我列举了可用的适配器,然后推送到 std::vector ,这工作正常:

然后我用这些适配器填充组合框并允许选择我想要使用的一个。

当我尝试枚举输出并获取可用的显示模式时,首先我从组合框中选择了适配器:

我检查了所选适配器的地址,它与枚举适配器时获得的地址匹配。

然后,尝试枚举输出并获取它们的描述:

还有问题。循环找到我的两个监视器并为所有监视器返回 pOutput 指针,但是当我尝试触发 GetDesc(odesc) 时,不会返回 odesc。看起来 pOutput 指针指向...空对象。无论我要检查哪种后台缓冲区格式,枚举可用的显示模式都会产生 0 个可用模式。

谢谢,帕特里克

0 投票
0 回答
957 浏览

c++ - 如何以编程方式获取/访问/识别视频适配器上的 HDMI 端口

我的要求是通过 HDMI 渲染帧,以便它可以显示在附加的输出显示设备上作为其视频的叠加层。我的研究表明 Direct3D DXGI 将是实现帧渲染的好方法。所以我研究了它并学习了如何使用 Direct3D 渲染帧。此外,为了渲染帧,我能够枚举图形适配器并找到它的细节。然而,我的进一步研究表明,为了通过 HDMI 渲染帧,我需要识别图形适配器的 HDMI 端口,以便我可以通过 hdmi 传递该帧并进行渲染。那是我被困了很长一段时间的地方。任何建议或代码段或任何其他方法,我都可以通过它们实现通过 HDMI 将帧渲染到输出显示设备上,我们将不胜感激。

0 投票
0 回答
1437 浏览

c++ - 如何在连接到计算机 HDMI 端口的显示器(或电视)上渲染图像

我对 DirectX 10 编程很陌生,我一直在尝试用我有限的技能做以下事情。

我正在尝试将图像从一台机器显示到通过 HDMI 连接的另一台输出设备(另一台显示器/电视)上。我对其进行了研究,并了解到 DXGI 对于渲染目的非常有用。此外,在进一步研究时,我在这里遇到了这个链接。它确实展示了如何在连接到主机的多个监视器上显示不同的图像,但它需要扩展显示

我的要求是,当我运行代码时,它应该在另一个输出设备上渲染图像而不使其成为扩展显示。

我正在尝试的方法是我正在枚举视频适配器(在我的情况下是 1 ),然后枚举可用的输出,这些输出应该是两个,因为我有一个 HDMI 输出连接到我的 PC。但是,如果我没有设置扩展显示,它只会在我的枚举输出数组中显示一个可用的输出,如果我扩展显示,它会显示其中的两个。一旦我完成了枚举输出,我想在所需的输出上渲染该图像。

据我所知,每个视频适配器都有一个连接 HDMI 的端口。

我想知道,是否有办法以编程方式访问该端口并可以使用该端口呈现图像?

除了 MSDN,这些概念的文档或解释相当有限,因此非常欢迎任何帮助。这是我的一些代码: