使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES
使用glBindAttribLocation
功能可有一個人給我完整的上下文?是不是像
g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector();
在DirectX 10?在各網站上在線閱讀,但無法使用此功能。需要幫助..
使用glBindAttribLocation功能我不明白在OpenGL ES 2.0的在OpenGL ES
使用glBindAttribLocation
功能可有一個人給我完整的上下文?是不是像
g_pLightDir = g_pEffect10->GetVariableByName("g_LightDir")->AsVector();
在DirectX 10?在各網站上在線閱讀,但無法使用此功能。需要幫助..
這個函數讓我們爲用戶定義的着色器屬性指定一個屬性索引(不是爲了你的代碼示例建議的統一),稍後在引用屬性時使用。
假設你有一個頂點着色器:
...
attribute vec4 vertex; //or 'in vec4 vertex' in modern syntax
attribute vec3 normal;
...
然後,您可以綁定指數的那些變量,與
glBindAttribLocation(program, 0, "vertex");
glBindAttribLocation(program, 1, "normal");
你可以使用任何你喜歡的非負數(在一個小範圍內)。然後,在引用這些屬性時,可以使用它們的索引,例如在glVertexAttribPointer
或glEnableVertexAttribArray
功能。
但請記住,在鏈接程序之前必須調用glBindAttribLocation
。你也可以忽略它。然後,OpenGL在鏈接過程中自動將索引綁定到所有使用的屬性,稍後可以通過glGetAttribLocation
查詢。但是使用glBindAttribLocation
,您可以建立自己的屬性索引語義並保持一致。
較新版本的GLSL甚至讓你的着色器(使用layout
語法)範圍內指定的屬性指標,不再需要爲任何glBindAttribLocation
或glGetAttribLocation
,但我不知道這是在ES支持。
但我的回答並沒有告訴你比你看過的那些「各種」網站或任何好的OpenGL/GLSL書籍,所以如果你還沒有得到它,深入探討GLSL的基礎知識。
如果你不使用glBindAttribLocation是否有保證的默認排序,如0,1,2 ...或者是在這種情況下需要調用glGetAttribLocation? – Jochen
@Jochen如果您不使用'glBindAttribLocation',則無法保證,您需要'glGetAttribLocation'。儘管一個合理的駕駛員可能會使用第一個連續的指數,但是沒有任何東西阻止他使用任意數字。 –
我從來沒有使用過的Direct X,但glBindAttribLocation被用來定義你的着色器屬性的位置,你在你的着色器有這樣一行:
attribute vec3 g_LightDir;
然後你可以使用glBindAttribLocation設置位置對於那個vec3,你必須在將頂點着色器附加到着色器程序之後,但在鏈接它之前(或者你必須「重新鏈接」它)來做到這一點。如果你不指定一個位置,編譯器會爲你做,並且你可以用glGetAttribLocation查詢位置。
你是否已經想出了自己,忘記了自己的問題,或者你還想問一些問題? –