c++ - 如何为我的 Vulkan 类创建这个通用数据结构字段?

标签 c++ generics vulkan

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

这个类会包含对应的Vertex Buffer,以及descriptor set布局,descriptor pool,descriptor sets等等,问题是如何管理uniform 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;

};

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

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>() };

问题是有多种类型的统一缓冲区(矩阵、 vector 、 float 、 bool 值等...)所以我被困在写什么作为 std::pair 对象的第一个元素上。

感谢您的宝贵时间。

最佳答案

您可以使用 std::variant<>然后你用 get<>() 下拉到正确的类型当你需要的时候。

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

此外,这更像是一种风格,但我不喜欢使用 std::pair像那样。制作一个具有专用字段名称的小型结构(除了想出名称之外)的工作量很小。而且您不必处理 std::pair的特点。

关于c++ - 如何为我的 Vulkan 类创建这个通用数据结构字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54513031/

相关文章:

c++ - 在工作线程上运行的 WebKit

swift - 内联属性实例化不适用于通用 UICollectionViewCell 子类

c# - 按 id 从通用列表中删除对象

vulkan - 如何使用VkPipelineCache?

vulkan - 什么是解析附件?

c++ - 我可以在 C++ 中使用 MiGLayout 吗?

c++ - 未找到版本 `GLIBCXX_3.4.22'

java - int、char也是抽象数据类型吗?

c# - 在 PowerShell 中调用通用静态方法

vulkan - 并发使用VkSamplers?