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

时间:2019-02-04 09:16:20

标签: c++ generics vulkan

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

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

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 :: pair的第一个元素将保存相应的对象(在这种情况下为矩阵),第二个是向量的统一缓冲区,因此它们可以与交换链中的图像数量一样多):

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 :: pair对象的第一个元素上。< / p>

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以使用std::variant<>,然后在需要时使用get<>()将其下拉至正确的类型。

模板将是您需要包含的所有可能类型的列表。

此外,这更像是一种样式,但我不喜欢这样使用std::pair。用专用的字段名称(而不是考虑名称)来制作一个小结构几乎是不费吹灰之力的。而且您不必处理std::pair的特殊之处。