2010-08-02 60 views
6

喜再次欢迎管理glUniform功能,另一个“那岂不是巨大的,如果我们会结合两件事情,我真的什么都不懂about'-问题;)使用模板

本集: OpenGL制作和C++模板

想法:如果您可以编写单个模板函数来设置OpenGL着色器中的制服,这不是很好吗?

问题:使用一些glUniform *函数设置着色器中的制服。这些不同之处:

  1. 类型:有几种类型的统一可以采取。这导致OpenGL中不同的函数名称如下所示:glUniform1f,glUniform1i,glUniform1fv等。

    这些可以使用函数重载轻松地“统一”。但是这会导致大量类似的功能。

    第一个问题:是否可以在这个地方使用模板?据我了解模板,你将不得不专门为每个新功能。最后,您将拥有与简单重载相同数量的功能。

  2. 参数计数:在glUniform功能referes与数给定的参数的数量。有4个参数涉及简单的值,直到有4个元素的向量。

    第二个问题:是否可以使用模板实现“动态”参数计数?

  3. 矩阵:为了使事情复杂化还有另一类其中发送矩阵均匀的功能,但因为我没有真正使用这些我不是他们真正的兴趣。

可能没有真正的方法来简化统一的方法......但也许有人可以想出一个伟大的解决方案,使用强大的模板?

亲切的问候, 弗洛里安

+0

你需要在某处映射'(Arity,Type) - > GL function',你只能使用声明方法缩短它。尽管它是一个有限且相对较小的函数集,所以我只是为了超载而去做。 – 2010-08-02 11:06:35

+0

在Java中,使用反射会相对容易...但是这样会变得混乱;) – fho 2010-08-03 07:50:27

回答

5

1:是的,是的,但至少当编译器抱怨说,它不能float和double重载之间选择,你可以强迫他非常简单,即setUniform<float>(blah)代替setUniform(blah)

2:这一次超载是一个简单的解决方案:)

3:问题是什么?

问题是,你为什么想要做这样的事情?

+0

哦,哇,感谢编辑 – Calvin1602 2010-08-02 22:13:05

+0

我想我只是被大量看起来几乎完全相同的函数拒绝了。 – fho 2010-08-03 07:38:53

+0

名称约定非常简单:gl + FunctionName + NumParameters + ParamType,如果它是一个指针,则参数类型以'v'结尾 – Calvin1602 2010-08-03 07:56:14