2013-03-05 63 views
2

當使用layout(location = ...)指定着色器代碼中的頂點屬性位置時,我不需要在我的C++程序中使用glGetAttribLocation獲取位置。是否保證自動頂點屬性分配的順序是正確的?

如果我既沒有使用佈局限定符來定義着色器中的位置,也沒有在我的C++程序中獲取它們,它們會自動分配。問題是關於這個自動分配。順序是否與着色器代碼中的定義順序相同?

例如,在第一個着色器代碼中,位置保證與第二個着色器代碼中的位置相同?

// first shader code 
#version 330 

in vec3 position; 
in vec3 normal; 
in vec2 texcoord; 


// second shader code 
#version 330 

layout(location = 0) in vec3 position; 
layout(location = 1) in vec3 normal; 
layout(location = 2) in vec2 texcoord; 

此外,相同的規則是否適用於片段着色器輸出?現在我使用glBindFragDataLocation來獲取它們。

回答

3

自動屬性分配是任意的;他們遵循實現爲他們選擇的任何算法。

如果你沒有指定屬性位置,那麼你不能假設關於它的任何東西

2

否 - 至少有一個我知道的驅動程序在將屬性分配給它們之前按照字母順序排序,如果它們沒有明確的layout指令。另外,程序中未使用的任何屬性幾乎肯定會被遺漏,並且不會被分配到一個位置。

1

你可以發現,通過使用調試器分配給你的屬性值:

positionAttribute = glGetAttribLocation(shaderProgram, "position"); 
+0

我甚至可以把它們打印到控制檯'的std ::法院<< positionAttribute;';-) – danijar 2013-03-06 22:31:33

相關問題