如何为我的 Vulkan 类创建此通用数据结构字段
How to create this generic data structure field for my Vulkan class?
>我正在尝试为 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
的特殊性。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 结构字段名称与 GDB 中的 STL 数组冲突
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 如何为结构字段动态分配字符空间
- 实例化时结构字段中的默认值
- 如何使用函数的输出初始化 const 数组结构字段?
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 列出常量和数组结构字段的初始化
- 如何使用 gtest 构造检查存储在向量中的结构(字段)?
- 将带有结构字段的结构从C 返回到C#PINVOKE
- 嵌套结构字段的 clang 格式规则
- 如何匹配通过引用传递给模拟函数的结构字段
- 在C 中获得相反的结构字段
- 如何为我的 Vulkan 类创建此通用数据结构字段
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- 在编译时使用模板在跨结构字段中迭代
- C++通用数据结构 - 数据字段赋值运算符与复制 C'Tor
- 正在取消引用自定义结构字段的迭代器
- 结构字段上的智能指针
- 使用C预处理器在结构字段上进行迭代