Goo*_*ooo 5 c# opengl directx rendering
我使用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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是最小的WindowsService的一部分.我将重要的代码放入OnContinue函数中,因为它比启动代码更容易调试.我赋予此服务与活动桌面交互的权限.当我作为本地系统帐户运行服务时,桌面和windowstation工作但GraphicsAdapter的数量仍为0,当我使用专用用户帐户运行服务时,我甚至无法打开WindowStation.还有什么我可以尝试或我做错了吗?我在Windows 7机器上测试这个,而我登录,因为调试变得非常困难.这可能是个问题吗?
谢谢
早在 XP 时代,我就参与了一个项目,该项目成功地从一台机器上的服务调用 Direct3D 硬件渲染,而没有人登录控制台。我完全忘记了(巧妙的)细节,但它需要使用“Window Station 和桌面功能”API才能以某种方式获取可用的 HWND。不过,新的/服务器操作系统可能与所有新的安全内容完全不同。
如果 OpenGL 在这方面比 Direct3D 工作得更好,我会感到惊讶,尽管它可能值得一试。您可能会考虑的其他事项: