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

Whats a good design pattern for class that wraps shader parameter values

本文关键字:设计模式 参数 包裹 什么      更新时间:2023-10-16

我正在尝试设计一个可以包装着着色器参数的类此类实施。

问题是,显然,着色器参数值可以是不同类型的,无论我使用模板还是方法过载,它会导致很多混乱的代码,如果有人要使用此类,则可能不是一个非常令人愉快的代码经验。

是否有一些巧妙的设计模式曾经实施,会使所述班级的使用变得更加简单?我不会介意该机制是否更复杂,只要其实施不暴露于此类的用户。

也更加清楚,此着色器参数类是一个抽象的,因为它的目的只是存储参数,以便在我的代码库中更轻松地编辑和处理。它不相互作用或对实际着色器有任何了解。

编辑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,因为该类型已编码在密钥中。

我不确定您以前尝试使用模板基类遇到了哪些问题,但是此解决方案需要类似的问题。