2017-01-18 56 views
0

我已經看到了使用一些OpenGL的例子:清除glVertexAttribPointer的概念參數

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0); 

當將數據傳遞到頂點着色器,和一些使用方法:

GLint posAttrib = glGetAttribLocation(shaderProgram, "position"); 
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); 

哪裏position是第一個由頂點着色器接收的屬性(以及你可以說的管道本身的第一個屬性,我猜)。

有什麼區別?

這是一回事嗎?

如果我在第一個例子中指定了0,那麼這是否意味着它會轉到OpenGL管道的第一個屬性? (這是頂點着色器中的「位置」),它只是在第二個示例中執行代碼的一種較短的方式?

回答

1
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); 

index參數對應於在layout(location = index)的着色器。在GLSL,您可以通過執行

layout(location = 12) in vec2 position; 

然後指定輸入變量的位置,你應該運行

glVertexAttribPointer(12, 2, GL_FLOAT, GL_FALSE, 0, 0); 

如果着色器未指定layout(location)時,默認的佈局位置將被分配到輸入變量。因爲在你的情況下,position是第一個輸入變量,它得到的位置0

glGetAttribLocation(shaderProgram, "position");查詢輸入變量position的佈局位置。

更多信息可以在這裏找到:https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)