2010-08-02 61 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