2012-09-02 27 views
1

我剛剛通過關於頂點數組對象和頂點緩衝對象教程看完了,我不能從下面的代碼的OpenGL如何知道第一VBO(vertexBufferObjID[0])表示頂點座標,第二VBO鍛鍊(vertexBufferObjID[1])代表色彩數據?OpenGL如何知道每個頂點緩衝對象是什麼類型?

glGenBuffers(2, vertexBufferObjID); 

// VBO for vertex data 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[0]); 
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), vertices, GL_STATIC_DRAW); 
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

// VBO for colour data 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[1]); 
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), colours, GL_STATIC_DRAW); 
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(1); 

編輯:由於彼得的答案,我發現的代碼鉤向上以下兩行各VBO與着色器(索引0 & 1關聯到VBO指數):

glBindAttribLocation(programId, 0, "in_Position"); 
glBindAttribLocation(programId, 1, "in_Color"); 
+0

你好,你會好好分享你提到的教程嗎? – dxb

+0

我不記得了我的頭頂,但我想我用Google搜索類似「的OpenGL 3教程」。 –

回答

1

它不,你必須告訴它哪個是着色器。

layout(location = 0) in vec3 position; 
layout(location = 1) in vec3 color; 

void main() 
{ 
    /* ... */ 
} 
+0

啊,我發現glBindAttribLocation的調用分別用於「in_Position」和「in_Colour」,它們使用索引0和1。謝謝。 –

0

glVertexAttribPointer只是爲了與着色器使用。因此你作爲着色器的作家,總是知道每個屬性索引是應該做的,因爲它映射到某個變量在你的頂點着色器。您可以控制指標變量地圖命令glBindAttribLocationglGetAttribLocation,或從內部GLSL特殊的關鍵字。

如果您只是使用固定功能流水線(默認着色器),那麼您不想使用glVertexAttribPointer。代替用於固定功能管的等效命令和glVertexPointerglColorPointer等。注意,這些是不建議使用的命令。

另請注意,對於固定功能glEnableVertexAttribArray將被替換爲glEnableClientState