2011-05-16 56 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。我會給它一個鏡頭。