我在OpenGL中渲染一個多邊形,頂點數組名爲vertices
,final
索引緩衝區被稱爲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);
}
您可以在下面的圖像中看到解決方案如何工作的橢圓(凸),但不是一個星形(這是凹)。
不直接回答你的問題,但你有沒有考慮使用'glFrontFace(GL_CW)'來指定你的正面有CW順序? –
是的,但是我必須跟蹤每個多邊形的繞線順序,並在每次繞線順序發生變化時調用gl。當我這樣做的時候,我想我可能完全禁用撲殺。 – William
這與您的問題中的問題描述不匹配。在這個問題中,你說的是,因爲你在變換中應用了反射,所以纏繞順序會發生變化。現在你說每個多邊形都可以有不同的纏繞順序? –