是否可以在着色器类中使用"Key"设计模式?
Is using "Key" design pattern in shader class possible?
首先,我不知道"键"模式是否被接受为一般模式,但最近SO上到处都出现了某种模式,所以......
我想做什么?
在C++中创建着色器操作类。我在这里的问题特别关注设置统一值(从C++"直接"发送到 GLSL 的值)。
怎么了?
(快速解释,以便不习惯OpenGL的人也可以做出贡献)-统一变量是使用全局glUniform*
函数设置的,将当前绑定着色器中均匀的位置作为第一个参数(int
);
所以常见的用法是:
glBindProgram(myProgramNum);
int Location = glGetUniformLocation(myProgramNum, "myUniformParameterName");
float myValue = 42.f; // arbitrary data
glUniform1f (Location, myValue);
我已经创建了一些封装上述内容所需的方法,例如
void SetUniform1f (std::string const& name, float a);
void SetUniformVector3 (std::string const& name, CVector3 const& vec);
void SetUniformMatrix4 (std::string const& name, CMatrix4 const& mat);
但是,我注意到所有这些都使用glGetUniformLocation(int, const char*)
。由于其中一些将实时使用,这将导致不必要的性能开销。
第一个想法
我认为我可以为每个函数创建两个版本 - 一个采用std::string
和值,第二个int
和值,从而允许更快的访问。
但是,这不会使它们比纯粹的OpenGL访问更好,因为用户仍然可以向它们发送恶意参数。
第二个想法
因此,正确的方法是从着色器类生成某种"Key"对象,其中包含给定制服的位置。但是,它需要链接到特定的 CShader 类实例,因为可以在一个对象中生成密钥并将其传递给另一个对象,从而导致不需要的行为。
我的问题是 - 这样的事情在C++可能吗?我是否必须在键对象中保留指向"父"对象的指针,并测试它是否每次都是有效的参数,或者是否有任何语言/Boost 功能允许在它周围使用某种语法糖?
我能够推断出,密钥类应该嵌套在CShader中,并且有CShader作为朋友。此外,它还应该声明简单的构造函数私有,并重载复制构造函数,以便复制的对象仍然是有效的键。
您只需要一个整数即可设置统一变量。事实上,与其调用一堆glGetUniformLocation
,为什么不将这些值缓存在std::map<std::string, int>
中呢?查询map
会更快,不是吗?
在你的问题中,并非一切都清楚(父指针?,恶意值?),但最终CShader
类的假设用户想要一个设置统一值的快捷方式。实际上,您可以在着色器链接后查询制服(使用 glGetActiveUniform),也可以在必要时查询制服和缓存制服位置。
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 下面抽象工厂设计模式的实现是正确的吗
- sql记录集函数的状态设计模式
- 是否有可以处理方法调用依赖关系的设计模式?
- 是否可以在着色器类中使用"Key"设计模式?