簡體   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