2011-05-16 57 views
5

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

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

引擎分为两部分:引擎本身和渲染器。因此,如果没有其他方法,那么我也可以使用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机器上测试了这一点,而我登录了,否则调试变得非常困难。可能这是一个问题?

感谢

回答

0

早在XP的时代,我曾参与过一个项目,该项目成功地从没有人登录到控制台的计算机上的服务中调用Direct3D硬件渲染。我完全忘记了(巧妙的)细节,但它需要使用"Window Station and Desktop Functions" API以某种方式获得可用的HWND。尽管如此,新的/服务器操作系统可能与所有新的安全技术完全不同。

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

  • 的NVidia似乎非常多发展自己的GPGPU/CUDA的东西在脑海无头的服务器。它只是工作。它的意思是完全在非图形API上重新实现你的东西。
  • 微软的RemoteFX(Server2008R2和Win7)似乎让虚拟机更容易访问服务器GPU。 (相反,最简单的选择可能只是在虚拟机中运行渲染器。)
+0

非常感谢Window Stations的提示,您是否可以尝试记住一些必要的操作,因为这样做几乎正是我所需要的。从我目前阅读的内容来看,我需要将我的应用程序作为服务来运行,并有权访问交互式桌面(安全漏洞),然后以某种方式我应该能够创建一个有效的设备。但是,如何? ;) – Gooo 2011-05-17 07:41:49

+0

对不起,这是太久以前,我没有真正参与这一点的代码。(用EnumDesktopWindows?)来显示登录屏幕的桌面hwnd可能很简单,或者它可能更复杂,我实在记不清了。 – timday 2011-05-17 11:37:58

0

在使用OpenGL pbuffer付出上下文可能的工作就是让即使是锁定的桌面GPU加速的情况;然而,这很大程度上取决于驱动程序,这可能会导致PBuffer在锁定时永久损坏,因此YMMV。我会给它一个镜头。