2016-03-27 33 views
0

我正常的數據緩存到VBO,然後使用glVertexAttribPointer指向它:當使用glVertexAttribPointer時,我應該爲gl_Normal屬性使用哪個索引?

glVertexAttribPointer(<INDEX?>, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

不過,我應該用什麼樣的價值爲第一個參數,指標,如果我希望被綁定到gl_Normal數據屬性在着色器中?

我正在使用一個NVidia卡,我在這裏讀到https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php gl_Normal總是在索引2這些類型的卡。但是我怎麼知道gl_Normal在其他卡片的索引處?

此外,使用索引2似乎沒有工作,並且着色器中的gl_Normal數據都是(0,0,0)。

我知道glGetAttribLocation和glBindAttribLocation,但是文檔明確指出,如果嘗試使用以「gl_」開頭的內置頂點屬性之一,該函數將引發錯誤。

編輯: 利用OpenGL 3.0 GLSL 130

回答

4

你不知道。在使用核心輪廓和VAO時,不存在固定功能頂點屬性。

定義法線你自己的頂點屬性,在着色器:

in vec3 myVertexNormal; 

獲取屬性的位置(或bind it to a location of your choice):

normalsLocation = glGetAttribLocation(program, "myVertexNormal"); 

然後用glVertexAttribPointer與位置:

glVertexAttribPointer(normalsLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

在覈心配置文件中,您還必須爲位置執行此操作,t以及exture座標等。 OpenGL實際上並不關心數據是什麼,只要你的頂點着色器給gl_Position分配了一些東西,而你的片段着色器將某些東西分配給它的輸出。

如果您堅持使用已棄用的固定功能屬性和gl_Normal,請改爲使用glNormalPointer

+0

嘿。我使用的是glsl 130,我可能應該提到過,所有'in'和'out'關鍵字都不存在(我的不好!)它還是一個類似的過程嗎? – ipe369

+0

@ ipe369用頂點着色器中的'attribute'替換'in'。 –

+0

啊,好的。非常感謝的人! – ipe369

相關問題