2014-06-26 117 views
0

我試圖用DrawRangeElements函數繪製,但由於某些原因,它沒有繪製出一部分元素。DrawRangeElements沒有正確繪製

例如,我有156分。我的每個元素包含52個點(3個元素x 52點= 156點)。

考慮這樣的代碼:

 //points contains 156 points 
     float[] points = new float[] { 
     1f, 2f, 3f, // 0 
     //.........   //refers to first element 
     4f, 5f, 5f, //51 

     6f, 7f, 8f, //52 
     //.........   //refers to second element 
     9f, 10f, 11f, //103 

     6f, 7f, 8f, //104 
     //.........   //refers to third element 
     9f, 10f, 11f, //155 
     }; 

隨着DrawElements一切工作正常。

var indices1 = Enumerable.Range(0, 52).Select(i => (uint)i).ToArray(); 
    var indices2 = Enumerable.Range(52, 52).Select(i => (uint)i).ToArray(); 
    var indices3 = Enumerable.Range(104, 52).Select(i => (uint)i).ToArray(); 

    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices1); 
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices2); 
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices3); 

DrawRangeElements我effors失敗。三個元素中只有一個正在繪製。

 var indices = Enumerable.Range(0, 156).Select(i => (uint)i).ToArray(); 

     GL.DrawRangeElements(PrimitiveType.QuadStrip, 0, 51, 52, DrawElementsType.UnsignedInt, indices); 
     GL.DrawRangeElements(PrimitiveType.QuadStrip, 52, 103, 52, DrawElementsType.UnsignedInt, indices); 
     GL.DrawRangeElements(PrimitiveType.QuadStrip, 104, 155, 52, DrawElementsType.UnsignedInt, indices); 

如何與DrawRangeElements我可以畫我的3個元素?

回答

3

你誤解了glDrawRangeElements()的作用。

呼叫

glDrawRangeElements(primtype, count, a, b, dtype, offsst; 

被渲染相同數據

glDrawElements(primtype, count, dtype, offset); 

無論什麼ab設置爲。當你對GL說謊你將要使用的範圍時,你會得到未定義的 行爲。你在這裏做的是繪製相同的52個頂點3次,在後兩個調用中有無效的範圍參數。

glDrawRangeElements()只是一個性能優化。您指定的範圍定義了索引數組中的最小值和最大值。所以你向GL保證你只能訪問頂點數組(和VBO)的一部分,但不能訪問元素數組的一部分。 GL可以利用這些知識進行一些優化(例如,如果在繪圖調用之後更新緩衝區的另一部分,則GL會知道它可以安全地執行此操作,而無需等待繪製調用完成)。

如果你想使用元素數組的不同部分,只需要使用不同的偏移量(或者指針,就你而言,因爲你似乎使用客戶端數組)。但是,我不知道爲什麼你使用glDrawElements()可言,因爲glDrawArrays會出您的方案牛年,也避免abogus枚舉陣列創建這樣的需求:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);