如何为我的 Vulkan 类创建此通用数据结构字段

How to create this generic data structure field for my Vulkan class?

本文关键字:数据结构 字段 创建 我的 Vulkan      更新时间:2023-10-16

>我正在尝试为 Vulkan 中的"实体"创建一个类(实体是可以在窗口中呈现的图形对象);

这个类将包含相应的顶点缓冲区,以及描述符集布局、描述符池、描述符集等,问题是如何管理统一缓冲区,因为我想要这样的东西:

class Entity final {
public:
    enum class Uniform_Type : char {
        MODEL_MATRIX, VIEW_MATRIX, PROJECTION_MATRIX, AMBIENT_VECTOR, DIFFUSE_VECTOR,
        SPECULAR_VECTOR, SHININESS_FLOAT, LIGHT_AMBIENT_VECTOR, LIGHT_DIFFUSE_VECTOR,
        LIGHT_SPECULAR_VECTOR, IS_LIGHT_SOURCE_BOOLEAN, LIGHT_POSITION_VECTOR,
        VIEW_POSITION_VECTOR
    };
    // Private fields
    std::unordered_map<Uniform_Type, std::pair<WHAT_HERE, std::vector<Uniform_Buffer>>> uniformsMap;
};

因此,如果我的类只需要模型、视图和投影矩阵,我将做这样的事情(std::p air 的第一个元素将保存相应的对象(在本例中为矩阵),第二个元素是统一缓冲区的向量,因此它们可以与交换链中的图像数量一样多):

uniformsMap[MODEL_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };
uniformsMap[VIEW_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };
uniformsMap[PROJECTION_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };

问题是有各种各样的均匀缓冲区(矩阵,向量,浮点数,布尔值等),所以我被困在写什么作为std::p air对象的第一个元素上。

谢谢你的时间。

您可以使用std::variant<>,然后在需要时

get<>()下拉到正确的类型。

然后,该模板将是您需要它包含的所有可能类型的列表。

另外,这更像是一种风格的东西,但我不喜欢使用这样的std::pair。使用专用字段名称(除了构思名称)制作一个小结构很少。而且你不必处理std::pair的特殊性。