Вопросы о glDrawRangeElements () - PullRequest
       31

Вопросы о glDrawRangeElements ()

4 голосов
/ 26 сентября 2011

Я пытаюсь отобразить некоторые данные старого уровня с помощью команды glDrawRangeElements (). Мои вершины настроены правильно, мои индексы настроены правильно, но я не могу заставить его визуализироваться. Я наконец проверил онлайн и наткнулся на пример, найденный здесь: http://www.songho.ca/opengl/gl_vertexarray.html

Из примера, я думаю, я делал это неправильно. Очевидно, начало - это значение индекса, а окончание - это значение индекса, а не индекс в массиве индексов. Я предположил, что, например, если вы хотите отрендерить 10 треугольников, начало будет 0, а окончание будет 29, а счет будет 30. Но я, очевидно, ошибаюсь?

Это было бы правильно, если бы значения индекса в 0, а 29 были фактически 0 и 29. Поэтому, если индексы начинаются с 400 и заканчиваются 452, вызов этого же массива будет вместо

glDrawRangeElements(GL_TRIANGLES, 400, 452, 29, GL_UNSIGNED_BYTE, indices);

Это правильно? Кто-нибудь еще думает, что это немного нелогично? Любой другой совет о вершинных массивах?

1 Ответ

20 голосов
/ 26 сентября 2011

Во-первых, давайте поговорим о glDrawElements, потому что версия Range является лишь его модификацией. count - это число индексов, которые нужно извлечь из исходного массива индексов для визуализации. Каждый индекс тянет карты к вершине. Итак, если ваш count равен «29», то вы пытаетесь отобразить 29 вершин. Это только отрендерит 27 вершин, если вы используете GL_TRIANGLES, поскольку каждый треугольник требует трех вершин. OpenGL откажется от дополнений.

Таким образом, если вы хотите отрендерить 30 индексов, в качестве количества вы вводите 30.

Теперь, когда мы знаем, как использовать glDrawElements, давайте поговорим о glDrawRangeElements. При обычном использовании glDrawElements вы указываете местоположение в массиве исходного индекса для извлечения. Параметры indices и count сообщают OpenGL, где искать индексы. Но фактические индексы, извлеченные из этого массива, могут быть в любом месте в границах индексов исходного массива вершин.

glDrawRangeElements позволяет дать OpenGL диапазон (включительно, потому что это имеет смысл) значений индекса вершины . Вы говорите, что индексы, которые он получает во время этого розыгрыша, не будут превышать этот диапазон. Это может позволить драйверу выполнить полезную оптимизацию. Значение start должно быть самым низким значением индекса, которое будет получено из массива индекса, а значение end должно быть самым высоким. Он должен не просто быть индексом первой и последней вершин.

...