问题标签 [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.
directx - DXGI 桌面捕捉
我正在使用DXGI
. 我在循环中调用这个函数。
但有时map.pBits
是null
。我不知道什么时候。这就像随机时间。如果我增加Sleep()
循环中的时间,它不会变成null
. 请告诉我原因...
dxgi - 无法修复 DXGI_ERROR_INVALID_CALL - DX12
我在调用 CreateSwapChain 时收到 DXGI_ERROR_INVALID_CALL。这是我创建命令队列的代码。
这就是我调用 CreateSwapChain 的地方。
我的hr返回上述错误。任何帮助,将不胜感激。
更新(问题仍然存在)
- 删除了亚当在评论中指出的对 SecureZeroMemory 的不必要使用
- 发现 hr 返回 S_OK 窗口模式。似乎问题与全屏模式有关
c++ - 英特尔集成显卡错误识别 (DXGI)
我正在用一个由 DirectX 12 处理的空白交换链填充一个窗口。虽然用 Explicit Multi-Adapter 玩了一轮,但我遇到了这种奇怪的行为......
如目前几乎所有 DX12 演示代码所示,我遍历所有我使用的 DXGI 适配器,IDXGIFactory4::EnumAdapters1()
以找到最合适的(或在我的情况下是每个)适配器D3D_FEATURE_LEVEL_11_0
或更高的适配器。如演示中所示,我丢弃了所有具有DXGI_ADAPTER_FLAG_SOFTWARE
这样的适配器:
在我的实现中,我将所有兼容的适配器转储到 astd::vector
中以供以后使用。
如果我使用断点检查运行时的一切情况,我注意到我的适配器列表在循环退出后仅包含一个适配器,这不是我所期望的,因为我同时拥有 NVIDIA GeForce GT 650M 和英特尔高清显卡4000。
通过在循环中中断并检查DXGI_ADAPTER_DESC2
每个适配器的结构,我发现我得到的确实是 GT 650M,这意味着我的集成显卡将自己标识为软件适配器。
这本身是合理的,但是如果您查看Ivy Bridge 芯片的图片(这就是我所拥有的),您会看到一个很大的区域被封锁为“处理器图形”,英特尔自己定义如下:“处理器图形参考到物理上位于处理器封装中或集成到处理器芯片中的图形。” 这只是对我尖叫“硬件适配器”。
如果我删除上面的代码块,我确实在我的列表中得到了两个适配器,但第二个将自己标识为“Microsoft Basic Render Driver”并提供供应商 ID 0x1414
,而 Google 表示英特尔通常返回0x8086
它的 ID。这份名单甚至没有提到0x1414
.
而且,更令人困惑的是,如果我在英特尔核芯显卡控制面板中查看信息中心,它会显示供应商 ID 为0x8086
!
在有人问之前:是的,我的驱动程序应该是最新的;我一注意到这一点就更新了它们。奇怪的是,DxDiag 给了我一个不正确的集成显卡驱动程序日期,但对 GT 650M 也是如此(虽然稍微接近事实)。独立 GPU 驱动程序是 WDDM 2.0,而集成显卡驱动程序是 WDDM 1.3,这可能是相关的,因为我认为它也应该是 2.0。(可能更新失败了?)
directx - 桌面复制 API 和可切换图形
问题:打电话IDXGIOutput1::DuplicateOutput 方法返回 DXGI_ERROR_UNSUPPORTED 当您在具有可切换图形的机器上使用独立图形控制器运行应用程序时。
这个答案为这个问题提供了一些启示。简而言之,独立显卡只渲染屏幕的一部分并将数据发送到集成显卡控制器的帧缓冲区——换句话说,所有输出总是通过集成显卡控制器。看来这就是 DuplicateOutput 返回 DXGI_ERROR_UNSUPPORTED 的原因。
我编写了一个示例,该示例使用winapi(EnumDisplayDevices 函数)和directx(IDXGIFactory::EnumAdapters 方法和IDXGIAdapter::EnumOutputs 方法)获取所有输出及其视频适配器,以在具有可切换图形(Intel HD 4600 和 NVIDIA 840M)的机器上进行比较。这是结果:
不确定我的比较可能有多正确,但你可以看到winapi说 DISPLAY1 属于 Intel 卡,directx说 DISPLAY1 属于 NVIDIA 卡。一种解决方案是复制英特尔卡的输出(因为一切都通过它),但 EnumOutputs 不返回任何输出。
目前有一种解决方法:始终使用集成图形控制器运行使用 Duplication API 的应用程序。
问题:如何使 DuplicateOutput 与具有可切换显卡的笔记本电脑上的独立显卡控制器一起工作?还是桌面复制 API 的限制?
c++ - DXGI Desktop Duplication API 何时将区域识别为移动区域?
我有一个使用 DXGI 桌面复制 API 捕获桌面屏幕的程序。
我得到了框架,IDXGIOutputDuplication::AcquireNextFrame
并且能够很好地逐帧捕获我的桌面。
为了继续前进,我尝试优化我的程序并尝试管理脏和移动的矩形。API 提供IDXGIOutputDuplication::GetFrameDirtyRects
和IDXGIOutputDuplication::GetFrameMoveRects
获取这些信息。
但是,似乎从来没有任何矩形被识别为被移动。文档说移动的矩形是:
桌面图像中的像素矩形,操作系统移动到同一图像中的另一个位置
这究竟是什么意思?DXGI 可以识别屏幕的任意部分已被移动吗?或者这可能只适用于被移动的桌面窗口?
c++ - 检索要通过网络发送的 ID3D11Texture2D 数据
我正在修改Microsoft 提供的桌面复制 api 示例,以捕获屏幕并通过网络将更新发送到我的应用程序。我知道如何实际发送数据;我的问题是从 ID3D11Texture2D 对象获取数据。
此时,我认为屏幕更新在m_AcquiredDesktopImage
. 我需要通过网络传输这些数据(尽可能高效)。
这个答案似乎在正确的轨道上,但我是 Windows 编程的新手,所以我需要一些额外的帮助。
这是我能想象的唯一解决方案IDXGIObject::GetPrivateData
c++ - 使用 Media Foundation 对 Direct X 表面进行编码
我正在尝试使用 MediaFoundation API 对视频进行编码,但在将样本推送到 SinkWriter 时遇到问题。
我正在通过 Desktop Duplication API 获取要编码的帧。我最终得到的是一个带有桌面图像的 ID3D11Texture2D。
我正在尝试创建一个包含此表面的 IMFVideoSample,然后将该视频样本推送到 SinkWriter。
我尝试过以不同的方式解决这个问题:
我调用
MFCreateVideoSampleFromSurface(texture, &pSample)
其中纹理为 ID3D11Texture2D,填写了 SampleTime 和 SampleDuration,然后将创建的样本传递给 SinkWriter。
SinkWriter 返回 E_INVALIDARG。我尝试通过将 nullptr 作为第一个参数传递并自己使用 MFCreateDXGISurfaceBuffer 创建缓冲区来创建示例,然后将生成的缓冲区传递给示例。
那也没有用。我通读了 MediaFoundation 文档,但找不到有关如何使用 DirectX 纹理创建样本的详细信息。
我没有东西可以尝试了。
有没有人以前使用过这个 API 并且可以想到我应该检查的东西,或者我可以如何去调试它?
dxgi - 着色器资源视图使用哪种格式进入深度模板缓冲区资源?
深度模板缓冲区资源被定义为DXGI_FORMAT_D24_UNORM_S8_UINT
格式。
我会假设要在该资源中创建着色器资源视图 (SRV),需要将视图格式描述为:
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
其中红色通道访问深度值DXGI_FORMAT_R24G8_TYPELESS
其中红色通道访问深度和绿色通道模板值
但是,创建此类 SRV 失败并出现以下错误:
D3D12 ERROR: ID3D12Device::CreateShaderResourceView: 对于资源格式 D24_UNORM_S8_UINT,在制作 D3D 视图时,视图的格式名称不能为 R24_UNORM_X8_TYPELESS。请参阅此资源格式的有效视图格式名称集的文档,确定资源(或其中的一部分)在着色器中的显示方式。[ STATE_CREATION 错误 #28:CREATESHADERRESOURCEVIEW_INVALIDFORMAT]
查看API 文档后,我得到了以下信息:
查看资源时,资源视图描述必须指定与资源格式兼容的类型化格式。这意味着您不能使用名称中带有 _TYPELESS 的任何格式创建资源视图描述。但是,您可以通过为视图指定类型化格式来查看无类型资源。
我真的不明白为什么不允许使用无类型格式以及我应该使用哪种格式?
windows - 使用 Desktop Duplication API 捕获登录和锁定屏幕
由于 Windows 10 不支持镜像驱动程序,我如何始终使用桌面复制 API 来捕获控制台,即从登录窗口开始,然后是用户的桌面(用户登录后)以及锁定屏幕?
directx - 将 DXGI_FORMAT 转换为 bpp
如何在不枚举的情况下将 a 转换DXGI_FORMAT
为bpp
(每像素位)值?(见格式)
例如: