【问题标题】:How to create this generic data structure field for my Vulkan class?如何为我的 Vulkan 类创建这个通用数据结构字段?
【发布时间】:2019-06-28 00:14:26
【问题描述】:

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

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

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

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 对象的第一个元素。

感谢您的宝贵时间。

【问题讨论】:

    标签: c++ generics vulkan


    【解决方案1】:

    您可以使用std::variant&lt;&gt;,然后在需要时使用get&lt;&gt;() 将其下拉到正确的类型。

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

    另外,这更像是一种风格,但我不喜欢这样使用std::pair。制作一个带有专用字段名称的小结构(除了想出名称)几乎不需要什么努力。而且您不必处理std::pair 的特性。

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2020-12-18
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多