2015-05-29 205 views
2

我的教程讀取最低限度頂點着色器需要低於定義:OpenglES 2.0頂點着色器屬性

attribute vec3 v3_variable; 
attribute vec3 v3Pos; 

void main() 
{ 
    gl_Position = v3Pos; 
} 

OpenglES傳遞到着色器頂點數據到v3Pos但這變量的名稱實際上可以做任何事情,其他教程將其命名爲a_Position,a_Pos,無論〜。

所以我的問題是,OpenglES如何知道,當我打電話給glVertexAttribPointer()它知道它應該將該數據放入v3Pos而不是v3_variable

+0

隨着版面設計聲明更清楚它是基於索引的,請參閱https://www.opengl.org/wiki/Layout_Qualifier_(GLSL) –

回答

1

有標識的兩種方法哪個屬性在着色器得到「配對」你提供glVertexAttribPointer數據。您使用glVertexAttribPointer獲得的唯一標識符是index(第一個參數),因此必須以某種方式通過索引完成。

在第一種方法中,在使用glGetAttribLocation進行編譯和鏈接後,從着色器中獲取該屬性的索引,並將其用作第一個參數,例如。

GLint program = ...; 
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos"); 
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable"); 
glVertexAttribPointer(v3PosAttributeIndex, ...); 
glVertexAttribPointer(v3varAttributeIndex, ...); 

您也可以明確地在創作時,着色器(如@日本的意見建議)設置的屬性的佈局,所以你會改變你的着色器,像這樣:

layout(location = 1) in vec3 v3_variable; 
layout(location = 0) in vec3 v3Pos; 

然後在代碼,你將它們明確:

glVertexAttribPointer(0, ...); // v3Pos data 
glVertexAttribPointer(1, ...); // v3_variable data 

第二種方法只適用於GLES 3.0 +(和OpenGL 3.0+),因此,如果您只使用GLES 2.0,可能並不適用於你的情況。另外請注意,您可以同時使用這兩種方法。例如。即使您明確定義了佈局,它也不會限制您稍後查詢它們。

+0

OP正在使用的ES 2.0不支持'location'限定符。它也使用'attribute'作爲屬性變量,而不是'in'。 –

+0

感謝您的解釋!我現在明白了:) – CodingNinja

1

好了,所以在應用程序方面,你將有一個電話,看起來像任何

glBindAttribLocation(MyShader, 0, "v3Pos"); 

在鏈接程序(你鏈接着色器之前)或

vertexLoc = glGetAttribLocation(MyShader, "v3Pos"); 

然後,glVertexAttribPointer調用的第一個元素將爲0或vertexLoc。

glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0)); 

總之,GL連接將會要麼分配v3Pos它自己的位置在內存中,或熄滅你告訴它的。無論哪種方式,您將不得不與着色器進行一些交互以與屬性進行交互。

希望幫助

+0

謝謝你的回答!沒有意識到第一個參數是屬性本身的索引。現在我這樣做:D – CodingNinja

相關問題