2013-04-30 114 views
5

OpenGL中統一位置和統一索引之間的區別是什麼?看起來您需要位置爲制服分配一個值,並且您需要索引來查詢有關制服的信息。均勻位置和均勻指數之間的區別?

爲什麼需要兩個值?爲什麼他們中的一個不能達到這兩個目的?

回答

8

看起來好像你需要位置來爲制服分配一個值,並且你需要索引來查詢關於制服的信息。

是的,這是兩者之間的差異。

爲什麼需要兩個值?

不要假設OpenGL API所做的任何事情都完全基於「需要」。有時候,這只是「我們很愚蠢」,或者「這是一個好主意,但現在它不再有意義了。」

統一的位置通常落在後面。

原來的想法,回到3D實驗室的原始GLSL提案,是統一的位置可以代表某種類型的字節偏移量。該位置是一個有意義的數字,表示實際的位置,用於制服的記憶。因此,實現不必使用查找表來將任意數字轉換爲實際內存所在的字節偏移量。該位置將是字節偏移或任何其他數據所需。

但是,除了可能的3D Labs自己的GLSL實現之外,實際上從未實際使用這種實現。統一的位置幾乎總是索引的第二種形式,並且glUniform調用會在表中查找它們。

這就是爲什麼我們現在有能力explicitly specify uniform locations。這基本上是ARB所說的,「我們放棄了,現在它們是指數」。但是他們不能只改變那些有區別的舊API,所以他們必須用兩種不同的方式來談論制服。

而他們並不是真的想。保持區別使得the query APIs在某些方面更容易使用。可用的統一索引是從0到某個可查詢計數的所有索引(GL_ACTIVE_UNIFORMS)。一旦您明確指定統一的位置,二分法就變得有用,因爲這些索引仍然是一個可查詢的與位置無關的數字。

這樣,API不必具有「獲取所有可用的統一位置」查詢。您只需查詢計數,然後從0到該計數的循環查詢信息。對用戶來說更容易,實施起來也更容易。

+0

是否有可能通過統一的名稱檢索索引,就像您使用統一的位置一樣,或者您在最後一段中描述了獲取索引的唯一方法? – 2013-04-30 15:29:33

+0

@DanWebster:是的,你可以[按名稱獲取索引。](http://www.opengl.org/wiki/GLAPI/glGetUniformIndices)通常,你通過索引查詢的東西的種類是你已經想要的東西知道你是否有名字。但你可以做到。 – 2013-04-30 16:21:36