引言
上几节我们绘制了自己的三角形并正确导入了着色器,今天我们将讨论从未讨论过的内容:设计抽象渲染 API 调用。
我们的引擎想支持多种图形 API,实际上是在不同的平台(诸如 Windows、MacOS、Linux、Android、IOS、PS4、XBOX、Switch 等等)上进行抽象的。
本质上,我们可以使用多个渲染 API 通过编译实现,当我实际编译我的代码时需要选择一个渲染 API 例如 DirectX,然后根据我们的配置文件编译。我们有 OpenGL Shader 类,DirectX Shader 类,而只有其中之一将被正确编译,这个“一”取决于配置设置。
该方案最大的问题在于对开发人员不够友好。假设我已经实现了 OpenGL,转向 DirectX 开发需要我在它们之间进行切换,此过程需要不断重新编译我的代码。
这样做的好处也很明显:性能。我们知道该使用哪个 API,所有工作都是离线完成的,引擎不必在此过程中做任何抉择,也不必浪费时间来决定当前使用哪个 API,它在编译时已经提前完成了。放弃了灵活性,带给我们更高的性能。
渲染API抽象
Infinite/Render/
目录下新建 Renderer.h
和 Renderer.cpp
。
|
头文件 Renderer.h
定义 API 类型和访问器。
|
Renderer.cpp
设置 API 为 OpenGL
。
缓冲大类设计
上一节为了尽快在屏幕上显示我们直接在 Application.cpp
中加入了许多 OpenGL 代码,所以今天我们需要封装这部分代码。
Infinite/Renderer/
目录下新建 Buffer.h
与 Buffer.cpp
。
|
在头文件 Buffer.h
中我们声明了顶点缓冲区和索引缓冲区,内置绑定函数和创建方法。
|
Buffer.cpp
使用 switch
语句筛选合适的图形 API,加入引擎的断言调试。
OpenGL缓冲实现
最后将之前在 Application.cpp
中内嵌的 OpenGL 语句解耦抽象,在 src/Platform/OpenGL
目录下新建 OpenGLBuffer.h
和 OpenGLBuffer.cpp
。
|
OpenGLBuffer.cpp
完成对顶点缓冲区和索引缓冲区类方法的实现:
|
应用类调整
Application.h
加入替代的顶点缓冲和索引缓冲共享指针:
#include "./ImGui/ImGuiLayer.h" |
Application.cpp
解耦之前的实现方式:
glGenVertexArrays(1, &m_VertexArray); |