C# 在锁定系统上渲染三维场景

C# 在锁定系统上渲染三维场景,c#,opengl,directx,rendering,C#,Opengl,Directx,Rendering,我使用SlimDX用c#编写了一个基于Direct3D 9的渲染引擎。在一个新项目中,我现在需要使用Web服务分发加载的3d场景的图片。问题是为了渲染任何东西,我需要一个Direct3d设备。是否有任何方法可以在用户未登录系统且桌面未锁定的情况下创建direct3d设备 如果这不可能,有人知道解决方法吗?最后,我需要一个可执行文件,可以使用一些本地用户帐户从task planner运行,或者需要一个服务,定期从某些视点渲染场景图片 引擎分为两部分:引擎本身和渲染器。因此,如果没有其他方法,那么我

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

如果这不可能,有人知道解决方法吗?最后,我需要一个可执行文件,可以使用一些本地用户帐户从task planner运行,或者需要一个服务,定期从某些视点渲染场景图片

引擎分为两部分:引擎本身和渲染器。因此,如果没有其他方法,那么我也可以使用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");
            }
        }
    }
这是最小Windows服务的一部分。我将重要的代码放入OnContinue函数中,因为它比启动代码更容易调试。我授予此服务与active desktop交互的权利。当我以本地系统帐户运行服务时,桌面和WindowsStation可以正常工作,但GraphicsAdapter的数量仍然为0,当我使用专用用户帐户运行服务时,我甚至无法打开WindowsStation。还有什么我可以尝试的或者我做错了的吗?我正在Windows7机器上测试这一点,同时我也登录了,因为否则调试会变得非常困难。这可能是个问题吗


感谢

在OpenGL中,使用PBuffer上下文甚至可以在锁定的桌面上获得GPU加速;然而,这在很大程度上取决于驾驶员,驾驶员可能会在锁定时将PBUFER设置为永久损坏,因此YMMV。我想试一试。

早在XP时代,我就参与了一个项目,该项目在没有人登录控制台的情况下,成功地从机器上的服务调用了Direct3D硬件渲染。我完全忘记了(巧妙的)细节,但它需要一些使用来以某种方式获得可用的HWND。不过,新的/服务器操作系统可能与所有新的安全功能完全不同

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

  • NVidia似乎在开发他们的GPGPU/CUDA产品时考虑到了无头服务器。它只是工作。这确实意味着完全在非图形API上重新实现你的东西
  • 微软的(Server2008R2和Win7)似乎使虚拟机更容易访问服务器GPU。(相反,最简单的选择可能只是在VM中运行渲染器。)

非常感谢对窗口站的提示,请您尝试记住一些必要的操作,以使此工作正常进行,因为这几乎正是我需要的。从我目前所读到的内容来看,我需要以服务的形式运行我的应用程序,拥有访问交互式桌面(安全漏洞)的权限,然后以某种方式我应该能够创建一个有效的设备。但是怎么做呢?;)抱歉,那是很久以前的事了,我并没有真正参与到这段代码中。它可能只是简单地为用于显示登录屏幕的桌面获取桌面hwnd(通过EnumDesktopWindows?),也可能更复杂,我真的不记得了。