# RHI 封装

图形api命令我们划分为资源管理（显存、内存的handle）与command。

思考：

所有的图形后端实现 interface 接口，GraphicsContext 作为资源管理类，可以create这些接口。而具体create什么则有各个后端对应的GraphicsContext所决定。当然 GraphicsContext 也作为渲染上下文，对应的绑定都由它完成。

command 则由 command list 所承接，命令都可以在 command list 创建，最后被执行。

## 难点

ogl和dx11有些差别，例如layout，ogl是需要有对应的vertex array，再去指定这个vertex array中的layout；而dx11则是把layout直接绑定到context，并且这个layout和vertex shader相关；同时在最后draw的时候ogl需要vertex array，而dx11不需要。

解决方法：

我们可以把这些封装到一个Pipeline类中，mesh中只存pipeline、vertex buffer和index buffer

对OpenGL的Pipeline类，我们去生成一个vertex array，并且根据这个layout进行处理；对dx11的Pipeline类，我们去根据vertex shader生成一个d3d11的inputlayout。

参考：

<https://github.com/dtrajko/MoravaEngine/blob/4280c37e4b1941ca6f3c975002ee9bd4f96e72c6/MoravaEngine/src/Hazel/Renderer/Pipeline.h>

<https://github.com/dtrajko/MoravaEngine/blob/master/MoravaEngine/src/H2M/Renderer/PipelineH2M.h>
