2013-03-19 20 views
3

背景:我正在開發一個應用程序,實際上繪製了一個巨大的3D節點和邊緣圖。節點繪製爲實例化立方體,而邊緣繪製爲GL_LINE,並用幾何着色器擴展爲由三角形條構成的三維立體「線條」。目前,我每次重繪邊緣時都會執行此擴展。然而,由於我的圖形完全是靜態的(節點不能移動,因此邊緣也不能移動),我認爲我只需要將定義擴展爲三角形一次,將擴展頂點捕捉到緩衝區中(使用Tranform反饋),然後從這一點開始,使用基本類型爲GL_TRIANGLE_STRIPglMutliDrawArrays使用捕獲的頂點繪製邊緣。使用均勻跨度時glMultiDrawArrays的替代方法?

問題:我繪製的所有這些體積線包含10個頂點。然而,glMultiDrawArrays需要一個起始索引和計數大小的數組,基本上描述了每個基元的起始點和計數(在元素中)。由於我的原始圖形的大小都不一樣,所以我會在起始索引&個計數中做出看似不必要的清單。 OpenGL提供了什麼樣的功能,可以讓我簡單地指定在什麼樣的基本重新啓動的情況下(在元素中)?

+0

+1解釋你爲什麼需要它。 – 2013-03-19 23:00:44

回答

3

有沒有這樣的功能,但爲了您的需要,你不需要一個。變換反饋不能輸出三角形條。它僅輸出基本基元:單個點,線或三角形。這就是爲什麼glBeginTransformFeedback只需要GL_POINTS,GL_LINESGL_TRIANGLES

您所要做的就是一次渲染所有邊緣,通過反饋將結果收集到一個緩衝區中,然後通過一次調用將整個事件渲染到glDrawArrays

+0

如果我做了以下操作:使用'GL_POINTS'模式使用'glDrawTransformFeedback'渲染線端點,將我的幾何着色器中的'out'佈局限定符設置爲點,並使用綁定到目標的緩衝區捕捉體積線頂點'GL_TRANSFORM_FEEDBACK_BUFFER'。然後,重新綁定該緩衝區以定位GL_ARRAY_BUFFER,並使用GL_TRIANGLE_STRIP模式調用glMultiDrawArrays來渲染捕獲的幾何圖形。這會工作嗎? – 2013-03-19 23:33:18

+0

@SirDigbyChickenCaesar:我不知道如何工作。您的着色器將不得不使用點寫入來輸出一個三角形條。不知何故。我不知道你爲什麼堅持這一開始;只是*渲染三角形列表*。這真的很簡單。爲什麼你需要*去掉這麼糟糕的東西? – 2013-03-20 00:16:50

+0

爲了正確使用輸出流,我必須從幾何着色器輸出點?因此,爲了完成我想要的任務,我需要輸出頂點的所有相關數據到不同的流(一個用於正常,一個用於位置等),而不管我將在下一個繪製例程中使用哪個基元。至於我爲什麼使用三角形條,它只是爲了節省開銷。雖然,我不確定保存的內存是否可以忽略不計,所以我可能會先渲染三角形。 – 2013-03-20 00:31:39