如何为我的 Vulkan class 创建这个通用数据结构字段?
How to create this generic data structure field for my Vulkan class?
我正在尝试在 Vulkan 中为 "Entity" 创建一个 class(实体是可以在 Window 中呈现的图形对象);
这个class会包含相应的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;
};
所以如果我的 class 只需要模型、视图和投影矩阵,我会做这样的事情(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 的第一个元素对象。
感谢您的宝贵时间。
您可以使用 std::variant<>
,然后在需要时使用 get<>()
下拉到正确的类型。
模板将是您需要包含的所有可能类型的列表。
此外,这更像是一种风格,但我不喜欢那样使用 std::pair
。制作一个具有专用字段名称的小型结构(除了想出名称之外)的工作量很小。而且您不必处理 std::pair
的特殊性。
我正在尝试在 Vulkan 中为 "Entity" 创建一个 class(实体是可以在 Window 中呈现的图形对象);
这个class会包含相应的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;
};
所以如果我的 class 只需要模型、视图和投影矩阵,我会做这样的事情(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 的第一个元素对象。
感谢您的宝贵时间。
您可以使用 std::variant<>
,然后在需要时使用 get<>()
下拉到正确的类型。
模板将是您需要包含的所有可能类型的列表。
此外,这更像是一种风格,但我不喜欢那样使用 std::pair
。制作一个具有专用字段名称的小型结构(除了想出名称之外)的工作量很小。而且您不必处理 std::pair
的特殊性。