【问题标题】:Offscreen rendering to a texture in a win32 service在 win32 服务中离屏渲染到纹理
【发布时间】:2009-06-26 07:09:35
【问题描述】:

我正在尝试编写一个可以渲染到纹理的 C++ Windows 服务。我已经将代码作为常规控制台应用程序运行,但是当作为服务运行时 wglGetProcAddress() 返回 NULL。

谁能告诉我这是否可行,如果可以,我需要做什么才能使 OpenGL 在服务进程中工作?


编辑:

我还没有让它在 Vista 下工作,但它在 XP 下工作。

【问题讨论】:

  • 我假设您通过将服务设置为与桌面交互以便获得与物理设备的连接来使其在 XP 中工作。不幸的是,在 Vista 和更高版本中这是不可能的,所有服务都在与交互式桌面不同的会话中运行,因此无法连接到它。
  • 为什么需要它作为服务运行?由于您需要有一个登录用户,并且该服务必须在交互式桌面上运行,否则它无法成功,将其编写为具有某种自动启动机制的用户应用程序似乎更有意义。跨度>
  • 我们希望将它作为服务运行,因为它基本上是一个渲染农场类型的应用程序,旨在在一堆无头计算节点上运行。让他们全部登录是不可取的,在机器启动时启动服务会更干净。

标签: opengl windows-services


【解决方案1】:

您可以使用 Mesa3D 获得功能齐全的软件渲染器。 只需构建 Mesa3D 并将其中构建的 opengl32.dll 与您的应用程序放在一起。 这应该使您能够使用 OpenGL 2.1 和扩展。 我们用它来测试 Windows 服务中的 Opengl 应用程序。

【讨论】:

    【解决方案2】:

    服务在非交互式桌面中运行。这些桌面不连接到计算机的物理显示设备,而是连接到逻辑显示设备。逻辑显示设备是非常基本的通用 VGA 设备,设置为 1024 X 768,没有花里胡哨。

    服务可以使用大多数 GDI 功能,但不能使用 DirectX 或 OpenGL 等高级图形功能。因此,您可以创建窗口、创建或检索设备上下文并执行一些相当复杂的绘图和渲染,但您只能使用简单的 GDI(和一些 GDI+)。

    如果你在 wglGetProcAddress 返回 NULL 后检查 GetLastError,你应该知道失败的原因。

    【讨论】:

      【解决方案3】:

      OpenGL 需要桌面访问权限来创建渲染上下文,并且默认情况下服务没有桌面访问权限。

      您需要以交互模式运行服务。为此,请进入管理工具中的服务属性。在您设置服务的登录用户的地方,您可以选择以交互模式运行服务,或者类似于“允许服务与桌面交互”的选项。您也可以尝试以其他用户身份登录服务。

      如果您正在使用 .Net IIS 应用程序,您还必须强制服务器的托管部分以其他用户身份登录。

      编辑:

      我忘了说,用户当前必须登录加速硬件桌面并且机器不能被锁定。这很糟糕,但这是我之前让它工作的唯一方法。我们有肮脏的脚本,一旦机器启动就让用户登录。

      附带说明,我们使用的是 DirectX,因此它可能不适用于 OpenGL。

      【讨论】:

      • 我试过了,勾选了“允许服务与桌面交互”,但还是不行。有趣的是 CreateWindowEx() 有效,我可以创建窗口句柄并获取消息,但是 wglGetProcAddress() 不起作用。
      • 您是否尝试过其他排列方式,例如将“登录身份”更改为用户帐户而不是“本地系统帐户”?
      • 这不行,交互式桌面运行在一些基本的非加速、非驱动 GDI 模式。
      • JMD 所说的。我知道这适用于 DirectX,但我不知道 OpenGL。我们制作了一个实时 3D 渲染服务并偶然发现了同样的问题。我们必须更改登录选项,并且在我们的案例中还必须强制 IIS 登录其他用户。
      猜你喜欢
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多