问题标签 [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-11 - IDXGISwapChain 不能出现在窗口子部分或子矩形中?
d3d9 可以通过参数呈现给子矩形。但在 d3d11 中找不到任何方法。甚至在窗口的子部分创建交换链,交换链填充所有窗口。
visual-c++ - 桌面复制 (DirectX) 屏幕捕获无法提供屏幕更新
我正在开发一个应用程序,该应用程序将通过桌面复制 API(使用 DirectX 11)捕获屏幕(仅与上一个屏幕更新的差异)并将其呈现在另一个窗口上(查看器可能在通过 LAN 连接的另一台机器上运行) . 该代码是MSDN 中提供的示例的改进版本。一切正常,除了设备没有提供任何屏幕更新,尽管中间有几次,在某些机器上大约有 10% 的时间发生这种情况(主要在 windows 8/8.1 机器上,很少在 windows 10 机器上)。我尝试了所有可能的方法来解决这个问题。减少了设备重置的次数,这为我提供了一些可靠的输出,但并不总是能 100% 正常工作。
设备有时无法提供初始屏幕(全屏)(在支持桌面复制的所有 Windows 操作系统上,这种情况发生率为 60%),我想出了一个解决方法,重试从设备,直到它提供一个但也导致了多个问题,设备甚至可能永远不会给出初始屏幕。
我已经投入了数周的时间来解决这个问题,但没有找到合适的解决方案,而且我知道没有讨论这类问题的论坛。任何帮助,将不胜感激。
下面是我的代码,用于获取与前一个屏幕差异、初始化设备、填充适配器和监视器。
请耐心等待很长的代码片段,在此先感谢。
要获取屏幕更新:
这是初始化设备的代码
最后得到当前帧和与前一帧的区别:
更新 :
每当设备挂起时,无法在 DUPLICATIONMANAGER 中获取下一帧(即在流式传输屏幕的过程中,例如:连续捕获视频并将其发送到另一端)
这是详细的错误信息:
Id3d11DuplicationManager::ProcessFailure - 错误:无法在 DUPLICATIONMANAGER 中获取下一帧,详细信息:已放弃键控互斥锁。
更新 2: 每当设备无法永远提供屏幕更新时,我都会收到错误代码,这里是一样的
Id3d11DuplicationManager::ProcessFailure - 错误:无法在 DUPLICATIONMANAGER 中获取重复输出,详细信息:访问被拒绝。
错误代码是 E_ACCESSDENIED。
我不明白为什么会出现此错误,因为我已经在 SYSTEM 模式下运行并且 SetThreadDesktop 已执行两次(一次在初始化期间,另一次在检测到故障后)
这是 MSDN 上错误的解释:如果应用程序没有访问当前桌面图像的权限,则为 E_ACCESSDENIED。例如,只有在 LOCAL_SYSTEM 运行的应用程序才能访问安全桌面。
还有什么会导致这种问题的吗?
visual-c++ - 桌面复制屏幕捕获 - DuplicateOutput 返回 E_ACCESSDENIED 错误
我正在使用桌面复制 API (DirectX11) 捕获屏幕。DuplicateOutput API 返回访问被拒绝错误,这在登录屏幕上的 Windows 8.1 机器上也非常罕见(可能是 10% 的时间),尽管我的应用程序以 SYSTEM 级别权限运行并且 SetThreadDesktop 被正确调用。我曾经在遇到每个错误后都重置并调用 SetThreadDesktop,但即使在多次设备重置和初始化之后,应用程序也无法从错误中恢复。在多次重试或重新启动应用程序后,我不得不回退到基于 GDI(从 directx 切换到 GDI 后应用程序工作正常)的方法,但这个想法似乎很糟糕。
注意:我确实在 Windows 10/Windows 8 机器上遇到了同样的问题,但与特定的 Windows 8.1 机器相比并不常见。
这是 E_ACCESSDENIED 错误的描述,它仅说明此错误的可能情况(没有系统级权限或未正确调用 SetThreadDesktop)。我尝试了所有可能的方法来找出问题,但不能。
任何帮助将不胜感激,在此先感谢。
下面是初始化设备的代码:
将桌面设置为当前线程的代码:
以下是处理错误码后返回的错误信息:
Id3d11DuplicationManager::ProcessFailure - 错误:无法在 DUPLICATIONMANAGER 中获取重复输出,详细信息:访问被拒绝。
graphics - 创建 Direct2D 图像源时不兼容的 DXGI 格式和 alpha 模式
问题
我在从 DXGI 表面创建 Direct2D 图像源时遇到问题。我正在 Visual Studio 2017 中创建一个 Windows 10 UWP 应用程序,其中部分处理用 C++ 编写的 Direct2D/3D 图形。
基本上,我从 YUV 图像中得到一个亮度值的数组,我现在想将其绘制为黑白图像。这些值在流中每帧出现一次,因此我想使用交换链来有效地呈现数据。在交换链示例的帮助下,我设法建立了一个交换链,当我使用其他数据进行测试时,我可以绘制该交换链。
创建图像源的代码是这样的:
当我使用上面的参数调用CreateImageSourceFromDXGI时,我得到一个异常,并显示以下错误消息(错误消息描述):
我可以通过调用访问连接到 ID2D1DeviceContext2 的 alpha 模式,例如auto foo = m_d2d_context2->GetPixelFormat();
我已经尝试设置从交换链缓冲区创建的渲染目标位图的 alpha 模式
D2D1_ALPHA_MODE_PREMULTIPLIED
(在我的代码所基于的示例代码中)和D2D1_ALPHA_MODE_IGNORE
. D2D1_ALPHA_MODE_STRAIGHT
当我尝试创建渲染目标位图时导致错误。我可以看到 alpha 模式确实是通过m_d2d_context2->GetPixelFormat()
. 没有任何帮助,我仍然收到相同的错误消息。创建交换链时,alpha 设置为DXGI_ALPHA_MODE_UNSPECIFIED
,格式为DXGI_FORMAT_B8G8R8A8_UNORM
.
在尝试创建黑白图像之前,我成功地从 YUV 数据创建和渲染图像源,在调用 CreateImageSourceFromDxgi 时,我使用 DXGI 格式DXGI_FORMAT_NV12
创建D3D11_TEXTURE2D
和参数。DXGI_COLOR_SPACE_TYPE::DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601
D2D1_IMAGE_SOURCE_FROM_DXGI_OPTIONS::D2D1_IMAGE_SOURCE_FROM_DXGI_OPTIONS_LOW_QUALITY_PRIMARY_CONVERSION
我的问题
- 问题是我使用的是不兼容的 alpha 模式
DXGI_FORMAT_R8_UNORM
吗?如果是这样,哪些兼容,哪些不兼容? - 有谁知道还有什么可以阻止我创建图像源?
- 有谁知道有人试图从像素数据数组中渲染 Direct2D 中的单通道图像的示例?
编辑:
我做了一个解决方法并创建了一个位图而不是图像源。
我仍然不知道创建图像源的代码有什么问题。
c++ - CreateDXGIFactory2 - 未解析的符号 - dxgi.lib
我目前正在尝试使用 DirectX 创建一些基本的,但我目前陷入困境,因为我似乎无法找到外部符号“CreateDXGIFactory2”。
我已经包含了库“dxgi.lib”,但它找不到外部符号。我还查看了 lib 本身,但它不在里面。
...由于某种原因,我缺少一个外部符号:
错误 LNK2001 无法解析外部符号 CreateDXGIFactory2 ConsoleApplication2
有谁知道我必须链接哪个库?
directx - 调整 Texture2D SharpDX 的大小
如何调整 SharpDX 的 texture2d 大小?我正在使用 SharpDX 复制屏幕,并使用 MediaFoundation 将纹理编码为视频文件。我的问题是,当我以全屏模式打开应用程序并且分辨率与系统分辨率不同时,我的录制内容出现空白屏幕。有没有更好的方法可以在编码到 mediafoundation 之前调整纹理大小而不会影响性能?我正在使用硬件加速。谢谢。
directx-11 - 如何使用 DXGISwapChain BackBuffer 渲染 ID3D11Texture2D 资源
AcquireNextFrame
使用DirectX11 API捕获 windows 屏幕,我对渲染部分有太多的困惑。如何使用backBuffer将ID3D11Texture2D
资源渲染到窗口中。DXGI_SWAP_CHAIN_DESC1
代码中的GetFrame(&Frame, &TimeOut)
函数将从这里得到ID3D11Texture2D
,Frame
所以下一步是渲染部分。使用 backBuffer 交换链将每一帧渲染到屏幕上。
我初始化了所有设备和驱动程序,但不知道我哪里出错了,我为此做了太多的研发,但即使是 DirectX 概念的新手,我仍然没有发现任何东西,所以请有人指导我。
c++ - 创建 Direct2D 设备中的内存泄漏
出于测试目的,我将代码放入一个 for 循环中,该循环创建并释放一千个 Direct2D 设备,但它从未释放分配的内存:
执行上面的代码需要大约 500MB 的内存。似乎释放设备没有效果。
我很感激任何帮助。
更新
我发现,如果我取消注释其余代码,这会导致使用创建的设备对ID2DRenderTarget::BeginDraw和ID2DRenderTarget::EndDrawRelease
进行一对调用,则该方法将按预期工作。如果我的代码以某种方式没有导致这些调用,它仍然很奇怪并且可能是问题。
c++ - 编译着色器时出错 - DirectX11
从昨天开始,我一直在努力解决一些编译器错误,试图编译 DirectX11 项目。在我创建并定义要渲染的对象之前,一切都运行良好。为此,我添加了一个着色器(类型效果)。
编译器告诉我““fxc.exe”以代码 1 退出”。为了解决这个问题,我遵循了这个答案:DirectX 编译错误:错误 MSB6006: "fxc.exe" exited with code 1
因此,我将 HLSL 编译器的着色器模型定义为:
但在此之后,我仍然遇到一些错误:
对于最后三个错误,我之前有过它们,但按照此 MSDN 页面的步骤 5-a 进行了修复:https://msdn.microsoft.com/en-us/library/windows/desktop/ee663275(v=vs. 85).aspx 但现在这些错误又回来了,我不明白为什么。我确实再次检查了项目属性,但错误仍然存在。
我认为这些是一些编译器错误,我尝试按照上述链接的第 6 步进行修复,但没有成功。
顺便说一句,我正在使用 Visual Studio 2015。
有人可以帮我吗?我真的一直在寻找答案并试图解决它,但现在似乎没有任何效果。谢谢你。