在运行时期间从OpenGL上下文切换到D3D / DX上下文(或其他上下文)

时间:2012-12-12 06:14:21

标签: c++ opengl directx sdl openglcontext

修改 是否有任何预先构建的库为我做这个,要么使用SDL OR运行在Window,Linux,Mac,iOS和Android?

目前,我不确定我改变上下文的方式是不是很好的设计,我还没有完全完成它。我真的很担心浪费时间。我正在使用SDL进行窗口管理和事件处理。

我目前在类中包装SDL(特别是SDL 2)来管理它。这些是我的课程以及他们的工作:

  • 窗口 - 描述窗口
  • WindowContext - 描述窗口的上下文(抽象类)
  • WindowDelegate - 用于确定上下文发生变化的时间,窗口打开/关闭的时间等等。
  • WindowEventListener - 收听来自Window的事件(不确定我是否应该坚持轮询而不是回调函数)

无论如何,这是一个如何运作的例子:

OglWindowContext* context = new OglWindowContext;
// change context's settings
Window window(ipoint2(), idimension2(640, 480), "Test Window", 
              Window::Resizeable, context, &windowListener, 
              NULL /* window delegate */);

while(window.isOpen())
{
    window.processEvents(); // calls back events to the WindowEventListener
    window.draw(); // calls the context's draw method
}

注意: ipoint2是2d点

我可以通过调用来改变上下文:

window.setContext(new Dx9Context); // or whatever context you would like

有没有更简单的方法,或者我应该说更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

在目前Windows的任何其他平台上切换渲染器没有多大意义,所以你对windows,linux,mac,ios和android支持的请求听起来很奇怪。也许你正在寻找一个可以帮助你一般移植的图书馆?

要实现使用一个渲染器或其他渲染器(opengl / d3d)运行,或者为了实现一般的可移植性,您需要实现某种可移植性层。

基本上,你可以从编写两个程序开始:一个在OpenGL中绘制一个旋转的立方体,另一个是完全独立的,与D3D相同。接下来,编写第三个程序,将它们组合在一起:

  • 摘要与通用接口背后的两个应用程序有所不同
    • 例如,但不限于,一旦你进入各种平台:
      • 应用程序控制循环
      • 渲染器(即图形输出)
      • 文件I / O
      • 用户输入
      • 音频
      • 系统服务(线程等)
  • 在所有目标平台上实施通用接口
  • 仅通过抽象接口实现应用程序功能

Windows上的D3D和OpenGL实际上可以被视为单独的平台,但您可以在应用程序启动期间选择一个或另一个 - 选择可能会影响渲染器和应用程序控制循环。

在运行期间切换也是完全可能的,但可能太麻烦,不值得。

您可能会注意到SDL实际上做了很多以上的事情。