2014-06-26 2 views
0

Я пытаюсь нарисовать с помощью функции DrawRangeElements, но по некоторым причинам он не рисует часть элементов.DrawRangeElements не рисуют надлежащим образом

Например, у меня есть 156 пунктов. Мой каждый элемент содержит 52 точки (3 элемента х 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() acutally делает.

Вызов

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

не оказывает те же данных как

glDrawElements(primtype, count, dtype, offset); 

независимо от того, что a и b устанавливаются. Вы просто получаете неопределенное поведение, когда вы лжете GL о диапазоне, который вы собираетесь использовать. То, что вы здесь делаете, рисует те же 52 вершины 3 раза, с недопустимыми параметрами диапазона в последних двух вызовах.

glDrawRangeElements() всего лишь оптимизация производительности. Указанный диапазон определяет, какое минимальное и максимальное значение в вашем массиве индексов будет. Поэтому вы гарантируете GL, что вы будете получать доступ только к некоторой части массивов вершин (и VBOs), но не к частям массива элементов. GL может использовать эти знания для некоторых оптимизаций (например, если вы обновляете еще одну часть буфера после вызова рисования, GL знает, что он может безопасно это сделать, не дожидаясь завершения вызова рисования).

Если вы хотите использовать другую часть массива элементов, просто используйте другое смещение (или указатель в вашем случае, поскольку вы, похоже, используете серверы на стороне клиента). Тем не менее, интересно, почему вы используете glDrawElements() вообще, так как glDrawArrays будет из вола в вашем сценарии, а также избежать необходимости создания таких abogus перечисления массива:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52); 
Смежные вопросы