2013-12-22 29 views
1

我試圖實現現代OpenGL,但問題是:大多數教程都基於3.3+,談論GLSL 330,我只有GLSL 130.因此,許多事情顯然不同,因爲我的VBO不工作。有和沒有着色器的VBO OpenGL C++

您能否給我一些提示或解釋如何在VBO中使用GLSL 130的教程?在我的情況下,我加載了vbo,但是當我使用我的着色器程序時,只有使用glVertex調用的頂點纔會呈現,就像vbo被忽略(無輸入)。如何解決這個問題?

你能使用沒有着色器的VBO嗎?我試圖做到這一點,但它崩潰了......

+0

VBOs和着色器(和着色器版本)在GL中是完全正交的功能。 (現代GL只需要這兩者。)是什麼讓你認爲「你的VBOs不工作」,僅僅因爲你使用GLSL 1.30而不是3.30? – derhass

+0

正如我所說,他們對我來說是新的,所以我遵循教程,但大多數教程(或我發現的)都是330 GLSL。例如,佈局(= 0)或者......不存在於130中,並且gl_modelview_matrix等可能在330中不存在。我根本不知道從哪裏開始...... – user209347

+0

你混合了很多不同的東西。 – derhass

回答

3

是的,VBOs仍然可以在GLSL 130中使用,甚至可以在沒有着色器的情況下使用。 VBO的目的是保存繪圖的頂點屬性。最最新的教程我已經看到有您使用的佈局位置確定,用於指示如何解決着色器的不同屬性,即

layout(location = 0) in vec3 Position; 

這不是在GLSL 130支撐,所以你必須有將屬性與VBO聯繫起來的另一種方式。這很簡單...你可以使用glBindAttribLocationglGetAttribLocation。調用glGetAttribLocation將爲您提供您需要在glVertexAttribPointer中使用的標識符,以將VBO數據與特定屬性相關聯。程序編譯完成後,您可以隨時調用它。另外,如果在創建程序對象之後但在鏈接着色器之前調用glBindAttribLocation,則可以調用glBindAttribLocation來專門設置將與給定屬性名稱關聯的標識符。這很方便,因爲它可以讓你自己決定該位置應該是什麼,就像你可以使用佈局說明符一樣。最後,如果你想在不使用着色器的情況下使用VBO,那麼你仍然需要找到一種將VBO中的數據與固定功能流水線所期望的各種輸入相關聯的方法。這是通過使用現在被棄用的方法glEnableClientState()glVertexPointer()完成的,它們一起讓您告訴OpenGL您將要填充的固定功能管道屬性以及它如何在VBO中查找數據。

+2

您實際上不必調用'glVertexPointer(...)','glVertexAttribPointer(0,...)'保證別名到頂點位置固定功能流水線。 'glVertexPointer'絕對是最好的方法,因爲不知道這些的人會被在固定函數應用程序中設置頂點屬性0指針的代碼混淆。 –

+0

我很好奇那裏有記錄,如果其他固定功能頂點屬性具有標準別名。 – Jherico

+1

如果你看看[OpenGL 4.4 *** compatibility *** profile](http://www.opengl.org/registry/doc/glspec44.compatibility.pdf)規範, 387分款**下的「10.8。2在頂點屬性爲零的情況下轉移頂點「**在醜陋的紅色(不贊成使用的)文本中,它描述了這種行爲,這僅適用於頂點屬性** 0 **,但是在GLSL引入核心(GL 2.0)之前, [ARB Vertex Program extension](http://www.opengl.org/registry/specs/ARB/vertex_program.txt)在表X.1 **下定義了一整套別名,它們不是***假設***在GLSL中工作 –