什么是包装着色器参数值的类的良好设计模式

时间:2016-12-24 17:22:45

标签: c++ templates design-patterns graphics

我正在尝试设计一个类,它将以这样的方式包装着色器参数,使其能够轻松设置并获取其值,而无需在此类实现之外编写大量验证代码。

问题是显然着色器参数值可以是不同的类型,并且我是否使用模板或方法重载它会导致很多混乱的代码,如果要使用这个类,它可能不会是一个非常愉快的经验。

是否有一些聪明的设计模式一旦实现会使所述类的使用更直接?我不介意机制是否更复杂,只要它的实现没有暴露给这个类的用户。

另外,为了更清楚,这个着色器参数类有点抽象,其目的只是存储参数,以便在我的代码库中更容易编辑和处理。它不会与实际着色器相互作用或有任何了解。

编辑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容器的存储类,进行映射和验证,我已经对它进行了排序。

2 个答案:

答案 0 :(得分:0)

模板值类怎么样?它不是一个特定的设计模式,但通过封装可以很好地满足您的需求:

1)不同类型的私人着色器数据及其公共访问者

2)数据发生变化时要执行的验证码(例如以setter编码)

答案 1 :(得分:0)

我首先要用键入的键替换当前的字符串属性名称,例如:

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,因为它是在密钥中编码的。

我不确定您之前尝试使用模板基类遇到了什么问题,但此解决方案需要类似的内容。