如何设计OpenGL DirectX"抽象层"

Jus*_*ers 6 opengl directx abstraction opengl-es

我正在阅读有关创建图形"抽象层"的信息,以便在图形平台之间切换.不幸的是,我无法找到关于这个主题的更多细节.这种抽象是否可以在功能级别上实现,具有类似的功能?

void pushMatrix(){
  if (directx){
     // do directx function

  }else if (opengl){
     // do opengl function
  }

}
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?有没有更好的办法?有人能指出一些做这个或更多示例代码的事情的例子吗?

Cal*_*602 7

通常做的是拥有一个"通用"渲染器的接口:

class RendererInterface{
    virtual DrawMesh() = 0;
    virtual SwapBuffers() = 0;
    /// etc
}
Run Code Online (Sandbox Code Playgroud)

每个lib有一个实现:

class OpenGLRenderer : public RendererInterface{
    virtual DrawMesh(){... }
    ....
}
Run Code Online (Sandbox Code Playgroud)

但这个概念与亚历山大的回答是一样的.


Ale*_*rty 5

是的,这就是它的工作原理。通过抽象您使用的图形 API,您将它从程序员需要担心的事情中移除。这类似于 GDI 抽象正在写入的设备的方式,例如程序员不必担心它。

从这个意义上说,与上述类似的函数库就像 HDC。它是这个抽象的接口。

比对 API 进行简单检查,然后调用适当的函数会更困难。这两个 API(DirectX 和 OpenGL)非常不同,将它们都抽象为一个接口并不容易,特别是如果您想涵盖大部分功能。

您需要更多的抽象然后简单地制作通用功能。您将需要创建更复杂的结构。

假设 OpenGL 要求您先调用函数 A,然后调用函数 B 才能使某些事情发生,但 DX 要求您先调用 func B,然后再调用 func A。为了适应这一点,您需要执行与此类似的操作:

void functionA(...) {
  if (OpenGL) {
    glFuncA();
  } else {
    //store parameters
  }
}

void functionB(...) {
  if (OpenGL) {
    glFuncB();
  } else {
    dxFuncB();
    dxFuncA( saved params );
  }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个很好的例子,但它展示了原理。为非常大的和不同的 API 创建一个抽象需要很多思考,并且比包装每个函数要付出更多的努力。