繁体   English   中英

在锁定的系统上渲染3D场景

[英]Render 3D scene on locked system

我使用SlimDX在c#中编写了一个基于Direct3D 9的渲染引擎。 在一个新项目中,我现在需要使用webservice分发加载的3d场景的图片。 问题是,为了渲染任何东西,我需要一个Direct3d设备。 有没有办法在没有用户登录系统且桌面未被锁定的情况下创建direct3d设备?

如果那是不可能的,有没有人知道一个变通方法? 最后,我需要一个可执行文件,它可以使用一些本地用户帐户或服务从任务计划程序运行,该服务器定期从某些视点呈现场景的图片。

引擎分为两部分:引擎本身和渲染器。 因此,如果没有其他方法,那么我也可以使用opengl或任何其他技术实现新的渲染器,这些技术允许渲染而不具有可见的形式。

编辑:

到目前为止我所拥有的是:

protected override void OnContinue() {
        base.OnContinue();

        NativeFunctions.SafeWindowStationHandle hwinsta = NativeFunctions.WindowStation.OpenWindowStation(
            "WinSta0", 
            true, 
            NativeFunctions.AccessMask.WINSTA_ALL_ACCESS);

        if(hwinsta == null || hwinsta.IsClosed || hwinsta.IsInvalid)
            Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());

        if(NativeFunctions.WindowStation.SetProcessWindowStation(hwinsta.DangerousGetHandle())) {
            NativeFunctions.SafeDesktopHandle ptrDesktop = NativeFunctions.WindowStation.OpenInputDesktop(
                0, 
                true, 
                NativeFunctions.AccessMask.DESKTOP_CREATEWINDOW);

            if(ptrDesktop.IsClosed || ptrDesktop.IsInvalid)
                return;

            if(!NativeFunctions.WindowStation.SetThreadDesktop(ptrDesktop.DangerousGetHandle()))
                return;

            Log log = Logger.Instance.CreateLog("DXService", true, true, false);

            log.LogMessage("Desktop set, creating D3D-Object.", LOGMESSAGELEVEL.CRITICAL, true);

            Direct3D direct3D = new Direct3D();
            log.LogMessage("Direct3D object created,  creating device.", LOGMESSAGELEVEL.CRITICAL, true);

            if(direct3D.AdapterCount == 0) {
                log.LogMessage("FATAL: direct3D.AdapterCount == 0");
            }
        }
    }

这是最小的WindowsService的一部分。 我将重要的代码放入OnContinue函数中,因为它比启动代码更容易调试。 我赋予此服务与活动桌面交互的权限。 当我作为本地系统帐户运行服务时,桌面和windowstation工作但GraphicsAdapter的数量仍为0,当我使用专用用户帐户运行服务时,我甚至无法打开WindowStation。 还有什么我可以尝试或者我做错了吗? 我在Windows 7机器上测试这个,而我登录,因为调试变得非常困难。 这可能是个问题吗?

谢谢

对于OpenGL,使用PBuffer上下文可能会在锁定的桌面上获得GPU加速; 然而,这很大程度上取决于驱动器,可能会在锁定时将PBuffer设置为永久性损坏,因此YMMV。 我试一试。

回到XP的时代,我参与了一个项目,该项目成功地从没有登录到控制台的机器上的服务调用Direct3D硬件渲染。 我完全忘记了(巧妙的)细节,但它需要使用“Window Station和桌面功能”API以某种方式获得可用的HWND。 不过,新的/服务器操作系统可能与所有新的安全性东西完全不同。

如果OpenGL在这个领域比Direct3D更好,我会感到惊讶,尽管它可能值得一试。 您可能会考虑的其他事项:

  • NVidia似乎正在开发他们的GPGPU / CUDA,并考虑到无头服务器。 它只是有效。 它确实意味着完全重新实现非图形API上的东西。
  • 微软的RemoteFX (Server2008R2和Win7)似乎使虚拟机更容易获得对服务器GPU的访问。 (反过来说,最简单的选择可能只是在VM中运行渲染器。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM