c++ - 多渲染系统

标签 c++ directx system render game-engine

在不久的将来,我将开始开发一个游戏引擎。我想包括的一项功能是拥有多个渲染系统,例如 directx 9/10/11 和 OpenGL。这样,使用该引擎的游戏将能够支持更多玩家,因为如果一个渲染系统不工作,它将恢复到另一个。

所以我的问题是,我该怎么做呢?我研究了一下,发现 Ogre3D 使用了类似的东西,但我不知道他们是怎么做到的。我基本上希望能够插入不同的渲染系统并使用相同的代码来运行它。

最佳答案

您可以创建一个接口(interface)类,允许您进一步扩展您希望扩展到的 API。

我过去这样做是为了创建一个 DirectX9\11 渲染器,我希望尽快将其扩展到 OpenGL。这项任务有很多确定性,但很容易解释它的基本工作原理。不幸的是,我正在进行的项目是封闭源代码的,因此如果您对此有任何疑问,请随时提问。

首先,您需要创建一个单独的项目用作 .lib/.dll,我称之为“RenderInterface”。这将包含 VertexBuffer、IndexBuffer、着色器的基本接口(interface),最重要的是 IRenderInterface 和 IRenderUtility,它们在以后的实现中可能包含诸如 ID3D11DeviceContext 和 ID3D11Device 之类的项目。

我在“RenderInterface”项目中最重要的两个项目是 IRenderInterface 和 IRenderUtility。这里的想法是让 IRenderInterface 完成繁重的工作,例如创建渲染目标、呈现和初始化 API。 IRenderUtility 将做更多常见的事情,例如创建顶点/索引缓冲区、创建着色器和渲染。我在初始化和渲染时更频繁地传递 IRenderUtility,而很少传递 IRenderInterface。这是为了防止用户在不需要时进行意外操作。该项目还将包括一些将在整个代码库中使用的通用结构\枚举。

然后我创建另一个项目,例如 D3D11RenderInterface。此 D3D11RenderInterface 将具有 IRenderInterface、IRenderUtlity、IVertexShader、IVertexBuffer 等的实现。

一个过于简单的例子是

class IRenderUtility
{
public:
    virtual void Draw(unsigned int vertexCount, unsigned int vertexStartOffset) = 0;
};

class D3D11RenderUtility : public IRenderUtility
{
protected:
    ID3D11DeviceContext *mD3D11DeviceContext;
public:
    void Draw(unsigned int vertexCount, unsigned int vertexStartOffset)
    {
        mD3D11DeviceContext->Draw(vertexCount, vertexStartOffset);
    };
};

这是通过在 IRenderUtility::Draw 调用之前调用 IRenderUtility 来设置 VertexBuffer 和 IVertexBuffer 来实现的。

然后,在你的应用程序中将只需要加载RenderInterface项目,和api实现。还有其他方法可以做到这一点,例如在整个代码库中使用#define'ing 代码,但我觉得这太麻烦了。

关于c++ - 多渲染系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8877471/

相关文章:

c++ - 如何使用 clang 仅获取主函数的 AST

c++ - 调用不活跃的union成员的成员函数

c++ - 如何判断 stderr 是否将输出定向到文件?

c++ - HLSL 几何着色器四边形正在移动

c++ - 链接问题 DirectX : Linker problem

c++ - 如何创建 Direct2D 工厂

macos - Cocoa:如何获取当前系统使用情况信息?

c - IPC vs 域 sock vs 命名管道

c++ - 从文本文件c++将外部算法加载到程序中

time - Docker 容器 : time/timezone wrong