Нужна помощь в организации различий в типах для рендеринга геометрии BSP

#c #opengl #bsp

#c #opengl #bsp

Вопрос:

В настоящее время я пытаюсь преобразовать другой формат в формат Quake 3 BSP. Формат Quake включает в себя вершины, грани, обозначения и текстуры.

Из информации, с которой мне приходится работать:

У меня есть вершины, которые представляют собой 3 структуры с плавающей запятой для местоположения x, y и z.

У меня есть полигоны, которые, как я мог бы предположить, являются гранями. Все полигоны треугольные и являются ссылками на индексы вершин и текстуры.

У меня текстуры отформатированы правильно.

Мои основные вопросы:

  1. Эквивалентны ли грани в формате BSP полигонам?
  2. Что такое обозначения в формате BSP? Они указывают на вершины или на нечто большее?

Ответ №1:

Формат BSP в Quake3 представляет все грани в виде треугольников (программисты иногда называют его «треугольным супом»). Это более эффективно для аппаратного рендеринга, чем формат Quake2, где грани могут быть полигонами с произвольными сторонами (3 вершины). Когда все грани являются треугольниками, вы можете нарисовать несколько граней одним вызовом, при условии, что эти грани используют один и тот же материал:

 glDrawArrays(GL_TRIANGLES, first_face->index, num_faces);
  

Такое пакетирование геометрии дает значительное улучшение производительности по сравнению с Quake2, где, поскольку каждая грань может иметь разное количество вершин, грани нельзя объединить в отдельные операции рисования: вместо этого вы должны вызвать glDrawArrays (или, что еще хуже, glVertex3f в цикле) для каждого полигона. Это ключевое отличие заключается в том, почему среды Quake3 могут содержать в 10 раз большую сложность, чем Quake2.

В любом случае, имейте в виду, что индексы — это не просто индексы в группе вершин. Они также являются индексами в координатах текстуры как для каналов diffuse, так и для lightmap. Надеюсь, это поможет.