Russian Qt Forum

Qt => OpenGL => Тема начата: Igors от Август 19, 2020, 13:54



Название: Индексы
Отправлено: Igors от Август 19, 2020, 13:54
Добрый день

Собсно никакого отношения к железяке OpenGL эта тема не имеет, это чисто "фундаментальные" (не побоюсь этого слова) структуры данных. Формально индексы - это просто вектор/контейнер int, напр
Цитировать
std::vector<int> idx = { 0, 2, 3, 3, 2, 1, 4, 3, 5 };
Самый частый случай: здесь 3 треугольника, первый юзает вертексы/точки (0, 2, 3), второй (3, 2, 1) и последний (4. 3, 5). Сами по себе вертексы - облако точек в пр-ве, оно еще не образует поверхность, вот для этого и нужны индексы которые подаются в команды рисования glDrawElements и.т.п. Однако такой расклад совсем не единственный, может быть напр так
Цитировать
std::vector<int> idx = { (0, 2, 3), (3, 2), (1, 4, 3, 5) };
Треугольник + отрезок + 4-угольник. Разумеется нужны доп данные чтобы определить сколько вертексов в каждом примитиве, и одной командой рисования здесь уже не отделаться.

Малодушные натуры часто стремятся обойтись без индексов, ну это плохо хотя бы потому что требует интенсивного дублирования вертексов. Другая возможность проскочить - песенка "только треугольники", это все резко упрощает.

Требуется: предложить эффективные структуры данных/контейнеры для работы с "подмножествами" индексов. Пример: пусть есть 3 треугольника исходного примера, юзер выбирает мышей один из них. В рез-те выбранный рисуется др цветом (напр красным).

Наверно это кажется совсем простым?  :)


Название: Re: Индексы
Отправлено: Igors от Август 21, 2020, 07:52
Пример: пусть есть 3 треугольника исходного примера, юзер выбирает мышей один из них. В рез-те выбранный рисуется др цветом (напр красным).
Представим эту задачу делает начинающий. Вероятно он рассуждал бы примерно так
------
ну значит нужно вызвать 2 команды рисования - одну для отрисовки "выбранных" (крвсным), другую для остальных (дефолтным цветом). Стало быть, вместо одного вектора индексов
Цитировать
std::vector<int> idx = { (0, 2, 3), (3, 2, 1), (4, 3, 5) };
нужно иметь два
Цитировать
std::vector<int> idxSelected = { (3, 2, 1) };
std::vector<int> idxRest = { (0, 2, 3), (4, 3, 5) };
Да, но как мне перебрасывать индексы из одного контейнера в другой? Заведу std::vector<bool> размер его = числу примитивов. Изменилось selection - фиксирую в этом bool векторе и пере-собираю оба вектора индексов из исходного.
------
Почему нет? Простая реализация. Но некоторых (включая меня) гложет червь сомнения - ну не оптимально же,  нехорошо молотить много тысяч из-за одной "переброски".

Словом, нужно показать "технику программирования". Ну так показываем. А то там какие-то страсти с "C++ 17" (и выше), "статическая рефлексия", весь спектр оттенков вумного указателя - и еще бог весть что совсем за рамками моего понимания. А доходит до дела - молчание std::ягнят