Самый практичный подход, скорее всего, самый простой: использовать отдельные массивы индексов для рендеринга линий и треугольников. Конечно, нет необходимости копировать атрибуты вершин, но рисование совершенно разных типов примитивов с одинаковыми индексами кажется весьма проблематичным.
Чтобы реализовать это, вы можете использовать два разных буфера индекса (GL_ELEMENT_ARRAY_BUFFER
). Или, более элегантно, ИМХО, используйте один буфер и храните в нем оба набора индексов. Скажем, вам нужно triIdxCount
индексов для рендеринга треугольников и lineIdxCount
для рендеринга линий. Затем вы можете настроить индексный буфер с помощью:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(triIdxCount + lineIdxCount) * sizeof(GLushort), 0,
GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
0, triIdxCount * sizeof(GLushort), triIdxArray);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
triIdxCount * sizeof(GLushort), lineIdxCount * sizeof(GLushort),
lineIdxArray);
Затем, когда вы будете готовы рисовать, настройте все свое состояние, включая привязку индексного буфера (в идеале, используя VAO для всех настроек состояния), а затем выполните рендеринг условно:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
if (renderTri) {
glDrawElements(GL_TRIANGLES, triIndexCount, GL_UNSIGNED_SHORT, 0);
} else {
glDrawElements(GL_LINES, lineIdxCount, GL_UNSIGNED_SHORT,
triIndexCount * sizeof(GLushort));
}
С точки зрения использования памяти наличие двух наборов индексов требует умеренных затрат. Фактические данные атрибутов вершин обычно намного больше, чем данные индекса, и ключевым моментом здесь является то, что данные атрибутов не реплицируются.
Если вы не хотите рендерить линии строго, а просто нуждаетесь в каркасном рендеринге, есть и другие варианты. Например, есть элегантный подход (сам никогда его не реализовывал, но он выглядит умным), когда вы рисуете пиксели только близко к границе полигонов и отбрасываете внутренние пиксели во фрагментном шейдере на основе расстояния до края полигона. Этот вопрос (где я дал ответ) подробно описывает подход: Каркасный шейдер — проблема с барицентрическими координатами при использовании общих вершин.
person
Reto Koradi
schedule
05.09.2014