2014-03-31 53 views
0

我遵循本指南http://open.gl/學習如何使用現代opengl進行編程。我陷入了一件事。早些時候用較老的opengl Api,我用來創建不同的函數來繪製不同類型的形狀。像drawRect(),drawCircle()等。我需要做的就是在glBegin()和glEnd()中使用不同組合的glVertex3f()。如何在OpenGL3.2 +中渲染多個形狀和對象?

但是在OpenGl3.2 +中,即使畫一個矩形,我們也得寫很多代碼。我知道它可以讓你更好地控制渲染,但是當你渲染多個東西,比如繪製矩形,圓形等等時,我很困惑該怎麼做。我是否需要多次編寫包含着色器的所有代碼,或者我可以重用代碼。

我已經實現了這個代碼http://open.gl/content/code/c2_triangle_elements.txt 這個例子繪製了一個矩形,但是如果我想繪製一個三角形以及這個矩形,那我該怎麼做。

+0

我認爲您需要充分理解着色器和緩衝區如何以更深入的方式工作。 通過頂點緩衝區邊界,您可以映射頂點並像這樣改變它們,或者在着色器中使用模型矩陣和均勻性來移動形狀並使用不同的模型矩陣繪製它兩次。 – CoffeeandCode

回答

2

您可以重複使用大部分代碼。所有着色器都可以加載一次,並通過調用glUseProgram來重用。至於所有緩衝區,您可以創建一次,然後按需要重複使用它們。

您可能想要創建一些類,如ShaderClassShapeClass

一個基礎着色器類通常會有2或3個參數,如programvertexShaderfragmentShader(都是一些ID)。當你擴展它們的時候,還可以添加着色器中的所有制服和屬性,以便稍後使用它們來修改繪圖(例如更改顏色)。

A ShapeClass通常會包含頂點緩衝區ID(以及可選的索引緩衝區ID)和要繪製的頂點數。

因此,最後當想要繪製某種形狀時,只使用已經創建和編譯的着色器,綁定並設置形狀緩衝區中的頂點數據並調用繪製。

+0

嗯...我得到它......感謝:) 我有點困惑,關於頂點數組對象。我是否要在開始或每個ShaderClass中創建一次。 我也必須每次連接和使用一個程序或一次後調用glVertexAttribPointer()。 –

+1

VAO與着色器完全無關。您可以將多個着色器使用相同的VAO。您需要在調用glUseProgram(包括頂點指針)後設置着色器需要的所有數據(並且僅在此之後)。除非結合頂點和片段着色器(您可能只有1個頂點着色器和2個片段着色器,然後共享它們),否則不要連接着色器兩次,但這與VAO無關,因爲在重新着色着色器之後,您將需要調用glUseProgram,然後重新綁定屬性和制服的數據。 –

+1

另請注意,如果繪製不同的形狀,則在使用該程序後,可能會調用多個glVertexAttribPointer調用。每次你想繪製一個不同的形狀(三角形,方形)時,你可以使用不同的VAO,在這種情況下,你綁定了一個不同的指針,但也綁定了不同的緩衝區。 –