2011-08-01 70 views
9

使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES

使用glBindAttribLocation功能可有一個人給我完整的上下文?是不是像

g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector(); 

在DirectX 10?在各網站上在線閱讀,但無法使用此功能。需要幫助..

+1

你是否已經想出了自己,忘記了自己的問題,或者你還想問一些問題? –

回答

25

這個函數讓我們爲用戶定義的着色器屬性指定一個屬性索引(不是爲了你的代碼示例建議的統一),稍後在引用屬性時使用。

假設你有一個頂點着色器:

... 
attribute vec4 vertex;  //or 'in vec4 vertex' in modern syntax 
attribute vec3 normal; 
... 

然後,您可以綁定指數的那些變量,與

glBindAttribLocation(program, 0, "vertex"); 
glBindAttribLocation(program, 1, "normal"); 

你可以使用任何你喜歡的非負數(在一個小範圍內)。然後,在引用這些屬性時,可以使用它們的索引,例如在glVertexAttribPointerglEnableVertexAttribArray功能。

但請記住,在鏈接程序之前必須調用glBindAttribLocation。你也可以忽略它。然後,OpenGL在鏈接過程中自動將索引綁定到所有使用的屬性,稍後可以通過glGetAttribLocation查詢。但是使用glBindAttribLocation,您可以建立自己的屬性索引語義並保持一致。

較新版本的GLSL甚至讓你的着色器(使用layout語法)範圍內指定的屬性指標,不再需要爲任何glBindAttribLocationglGetAttribLocation,但我不知道這是在ES支持。

但我的回答並沒有告訴你比你看過的那些「各種」網站或任何好的OpenGL/GLSL書籍,所以如果你還沒有得到它,深入探討GLSL的基礎知識。

+0

如果你不使用glBindAttribLocation是否有保證的默認排序,如0,1,2 ...或者是在這種情況下需要調用glGetAttribLocation? – Jochen

+0

@Jochen如果您不使用'glBindAttribLocation',則無法保證,您需要'glGetAttribLocation'。儘管一個合理的駕駛員可能會使用第一個連續的指數,但是沒有任何東西阻止他使用任意數字。 –

0

我從來沒有使用過的Direct X,但glBindAttribLocation被用來定義你的着色器屬性的位置,你在你的着色器有這樣一行:

attribute vec3 g_LightDir; 

然後你可以使用glBindAttribLocation設置位置對於那個vec3,你必須在將頂點着色器附加到着色器程序之後,但在鏈接它之前(或者你必須「重新鏈接」它)來做到這一點。如果你不指定一個位置,編譯器會爲你做,並且你可以用glGetAttribLocation查詢位置。