什么是包裹着色器参数值的类的好设计模式
Whats a good design pattern for class that wraps shader parameter values
我正在尝试设计一个可以包装着着色器参数的类此类实施。
问题是,显然,着色器参数值可以是不同类型的,无论我使用模板还是方法过载,它会导致很多混乱的代码,如果有人要使用此类,则可能不是一个非常令人愉快的代码经验。
是否有一些巧妙的设计模式曾经实施,会使所述班级的使用变得更加简单?我不会介意该机制是否更复杂,只要其实施不暴露于此类的用户。
也更加清楚,此着色器参数类是一个抽象的,因为它的目的只是存储参数,以便在我的代码库中更轻松地编辑和处理。它不相互作用或对实际着色器有任何了解。
编辑1:这是我以前尝试使用模板解决问题的方法以及为什么失败的原因:
我的模板值源自我用来将它们存储在STL容器中的非模板基类派生,但是在检索值并无法将其置于其模板值的情况下,我遇到了问题,这是另一个问题是在使用此类实施
时设置和获取值所需的代码量编辑2:
理想的用法是:
ShaderParameter* param = ShaderParameterCollection.GetParameter("color_param");
ShaderParameterCollection->GetParameter("property_name")->Set(vec3());
ShaderParameterCollection->GetParameter("property_name")->Get(&out);
ShaderParameterCollection->AddParameter("property_name", FLOAT_VEC3, vec3());
ShaderParamterCollection只是一个内部使用STL容器,进行映射和验证的存储类,我已经对此进行了排序。
模板值类怎么样?这不是特定的设计模式,但可以通过封装来很好地满足您的需求:
1)您的不同类型的私人着色器数据及其公共访问者
2)当数据更改时要执行的验证代码(例如,在设定器中进行编码)
我将首先更换您当前使用打字键的字符串属性名称,例如:
ShaderParameterKey<color> color_key("color_param");
ShaderParameterKey<vec3> property_key("property_name");
然后,您的收集方法可以将ShaderParameterKey<T>
作为输入并返回ShaderParameter<T>
。您的用法看起来像:
ShaderParameter<color>* param = ShaderParameterCollection.GetParameter(color_key);
ShaderParameterCollection->GetParameter(property_key)->Set(vec3());
ShaderParameterCollection->GetParameter(property_key)->Get(&out);
ShaderParameterCollection->AddParameter(property_key, vec3());
您不再需要将类型(FLOAT_VEC3
)传递给AddParameter
,因为该类型已编码在密钥中。
我不确定您以前尝试使用模板基类遇到了哪些问题,但是此解决方案需要类似的问题。
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 什么是包裹着色器参数值的类的好设计模式
- 接受Stdin或CLI参数的设计模式
- 依赖注入/继承设计模式的构造函数参数太多
- 是否有推荐的设计模式用于与过程通信参数
- 如何在PIMPL设计模式中调用参数化构造函数
- 初始化算法的设计模式,每个算法接受不同的参数
- 用于分配器类型参数的C++设计模式
- 设计模式- c++运行时成员参数的实例化
- 传递大量参数的c++设计模式