2016-07-13 100 views
1

我在OpenGL中渲染一個多邊形,頂點數組名爲verticesfinal索引緩衝區被稱爲DRAW_ORDER,CCW繞組。我已啓用背面剔除功能,並使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)進行繪圖調用。如何在x或y軸上反射頂點後恢復CCW纏繞順序?

當我通過矩陣變換在x或y軸上反射vertices時,由於反射顛倒了頂點的方向,所以它們不再匹配CCW繞組順序DRAW_ORDER

我可以通過禁用剔除來防止該問題,但出於性能考慮,我寧願找到一種方法來通過置換來恢復vertices的方向。例如,如果多邊形是三角形,我可以在反射後簡單地交換第二個和第三個頂點以恢復CCW方向。我怎樣才能將這種方法擴展爲具有任意數量的頂點和索引的多邊形?

//PSEUDO-CODE FOR TRIANGLE: 
    final DRAW_ORDER = {0,1,2}; 
    vertices = { {0,0}, {1,0}, {0,1} }; 
    reflect(vertices); 
    swap(vertices,1,2); 

編輯:這是一個解決方案,似乎適用於凸多邊形,但不是凹的。

//Reverse the order of the vertices so, for example, 
    //vertices {v1,v2,v3,v4,v5} become {v5,v4,v3,v2,v1} 
    for(int start = 0, end = vertices.length-1; start<end; start++, end--){ 
     swap(vertices,start,end); 
    } 

您可以在下面的圖像中看到解決方案如何工作的橢圓(凸),但不是一個星形(這是凹)。

enter image description here

+0

不直接回答你的問題,但你有沒有考慮使用'glFrontFace(GL_CW)'來指定你的正面有CW順序? –

+0

是的,但是我必須跟蹤每個多邊形的繞線順序,並在每次繞線順序發生變化時調用gl。當我這樣做的時候,我想我可能完全禁用撲殺。 – William

+0

這與您的問題中的問題描述不匹配。在這個問題中,你說的是,因爲你在變換中應用了反射,所以纏繞順序會發生變化。現在你說每個多邊形都可以有不同的纏繞順序? –

回答

0

要通過指數的排列顛倒纏繞順序,你可以簡單地恢復索引的順序。因此,對於你的三角形例子,如果原始順序是(0,1,2),相反的順序是(2,1,0)。由於所有循環排列對於定義一個多邊形都是等價的,所以其他有效的順序將是(1,0,2)和(0,2,1)。但是使用反過來和任何東西一樣好。作爲另一個例子,對於具有5個頂點的多邊形,使用索引(3,17,6,8,11),反過來是(11,8,6,17,3),其可以用作當你想渲染具有相反的繞線順序的多邊形時的一組索引。

+0

你的解決方案的工作原理,但我真的很想找到一個解決方案,而不是索引排列頂點。這樣,我可以有一個靜態的最終索引緩衝區,我所有的多邊形都可以共享。 – William