在远程桌面中创建 DirectX 设备失败

发布于 2024-12-15 03:42:49 字数 959 浏览 2 评论 0原文

我有一个使用 DirectX 捕获屏幕的应用程序。该应用程序在本地运行良好,但是当我通过远程桌面会话运行它时,IDirect3D9::CreateDevice 函数失败:

    d3dpp.Windowed=WINDOW_MODE;
    d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.BackBufferFormat=ddm.Format;
    d3dpp.BackBufferHeight=nDisplayHeight=gScreenRect.bottom =ddm.Height;
    d3dpp.BackBufferWidth=nDisplayWidth=gScreenRect.right =ddm.Width;
    d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hWnd;
    d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&g_pd3dDevice)))
    {
        ErrorMessage("Unable to Create Device");
        return E_FAIL;
    }

我使用 Windows 7 通过 RDP 访问 Windows Server 2008 R2。

这里究竟出了什么问题?我读到可以通过 RDP 使用 Direct3D。

I have an application that uses DirectX to capture the screen. The application works fine locally, however when I run it through a remote desktop session the IDirect3D9::CreateDevice function fails:

    d3dpp.Windowed=WINDOW_MODE;
    d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.BackBufferFormat=ddm.Format;
    d3dpp.BackBufferHeight=nDisplayHeight=gScreenRect.bottom =ddm.Height;
    d3dpp.BackBufferWidth=nDisplayWidth=gScreenRect.right =ddm.Width;
    d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hWnd;
    d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&g_pd3dDevice)))
    {
        ErrorMessage("Unable to Create Device");
        return E_FAIL;
    }

I am using Windows 7 to access Windows Server 2008 R2 with RDP.

What exactly is wrong here? I read that its possible to do use Direct3D through RDP.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

捶死心动 2024-12-22 03:42:49

我不知道失败的确切原因,但我可以给你一个方向。
当您通过 RDP 连接时,Windows 根本不会加载本机视频驱动程序,显示器上实际上不会显示任何内容。相反,系统会加载 RDPDD 虚拟视频驱动程序,该驱动程序会绘制系统内存中的所有内容,并通过网络将其发送到 RDP 客户端。这就是远程桌面的工作原理。

这样您的本机显卡/驱动程序就完全不参与其中。 RDPDD 是一个非常简约的“帧缓冲区”驱动程序,它根本不支持 Direct3D/DirectDraw。

OTOH,您使用 D3DDEVTYPE_REF 参数调用 CreateDevice,即使您没有兼容 D3D 的视频卡,该参数也应该可以工作,并且应该在软件中模拟 D3D。因此 - 我不知道为什么会发生这种情况。我猜测问题可能出在 D3DPRESENT_PARAMETERS 参数内。也许其中一些可能无法效仿。

尝试检查错误代码,使用 D3DPRESENT_PARAMETERS 进行操作。

I don't know the exact reason for failure, but I can give you a direction.
When you connect through the RDP the Windows doesn't load your native video driver at all, and nothing is actually displayed on the monitor. Instead the system loads the RDPDD virtual video driver, which draws everything in the system memory, and sends it to RDP client over the network. This is how remote desktop works.

So that your native video card/driver is not involved at all. RDPDD is a very minimalistic "frame buffer" driver, it does not support Direct3D/DirectDraw at all.

OTOH you call CreateDevice with D3DDEVTYPE_REF parameter, which should work even if you don't have D3D-compatible video card, the D3D should be emulated in software. Hence - I don't know why this happens. I can guess that the problem may be within the D3DPRESENT_PARAMETERS parameters. Perhaps some of them may not be emulated.

Try to check the error code, play with D3DPRESENT_PARAMETERS .

心安伴我暖 2024-12-22 03:42:49

哈哈,问题是我没有安装DirectX驱动程序。生效后!

Haha, the problem was I had not the DirectX drivers installed. After it works!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文