2012-04-21 37 views
0

我想在一個固定的VBO數組之間切換着色器程序運行時。如何判斷着色器的頂點屬性?

我THIK我不需要比固定頂點以下功能更多屬性的索引(我想0的位置,1紋理座標)

glEnableVertexAttribArray 
glVertexAttribPointer 
glGetAttribLocation 
glBindAttribLocation 

我已經連接好了一切,但一切都沒有吸引到FBO。 如果我使用從程序中找到的頂點屬性索引(在glVertexAttribPointer中),那麼它工作正常,但我不能將它與固定屬性索引一起使用。

有人可以告訴我一個簡短的示例代碼,它顯示了上述函數的正確使用/執行順序嗎?

有沒有缺失的步驟?

+3

-1:「有人可以給我看一個簡短的示例代碼,告訴我上述函數的正確使用/執行順序嗎?」這是一個可怕的問題。如果你不知道他們*做了什麼*,你不知道這些功能進入的順序的唯一方法。所以你需要問這些功能如何工作*;否則,你只是複製和粘貼編碼。 – 2012-04-21 10:02:58

+0

@Nicol:像這樣的東西 - http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml - 確實不錯,但告訴我關於執行順序的事情沒什麼。 – Geri 2012-04-21 10:50:31

+0

我真的知道glBindAttribLocation是做什麼的,但是當它連接我的程序後不能正常工作時,我不知道要去哪裏。 – Geri 2012-04-21 10:51:25

回答

3

問題是:在鏈接程序之前必須調用glBindAttribLocation。

glBindAttribLocation(program, ATTRIBUTE_POSITION, "position"); 
glBindAttribLocation(program, ATTRIBUTE_TEXTURE_COORDINATES, "textureCoordinates");  
glLinkProgram(program); 

然後你可以使用屬性陣列功能與固定指標,如:

glEnableVertexAttribArray(ATTRIBUTE_POSITION); 
glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORDINATES);  
glVertexAttribPointer(ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)0);  
glVertexAttribPointer(ATTRIBUTE_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)_textureCoordinatesOffset); 

如果指數只是簡單的整數,如:

//Vertex attributes. 
enum 
{ 
    ATTRIBUTE_POSITION,   //0 
    ATTRIBUTE_TEXTURE_COORDINATES //1 
}; 

它現在。所以我不必在每次繪製調用之前調用glVertexAttribPointer。

+0

這有助於:http://samplecodebank.blogspot。COM/2011/05/glbindattriblocation-示例-C-C-objc.html – Geri 2012-04-21 10:02:28

0

作爲醫生說(http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

屬性變量名稱到通用屬性索引綁定爲一個 程序對象可以隨時通過調用 glBindAttribLocation明確分配。直到 glLinkProgram被調用,屬性綁定纔會生效。程序對象成功鏈接 後,通用屬性的索引值保持固定 (並且可以查詢它們的值),直到發生下一個鏈接命令。

應用程序不允許使用此命令綁定任何標準OpenGL頂點 屬性,因爲它們在需要 時會自動綁定。 在程序對象鏈接了 後發生的任何屬性綁定將不會生效,直到下一次鏈接程序 對象。