Название: Индексы Отправлено: 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<bool> размер его = числу примитивов. Изменилось selection - фиксирую в этом bool векторе и пере-собираю оба вектора индексов из исходного.std::vector<int> idxRest = { (0, 2, 3), (4, 3, 5) }; ------ Почему нет? Простая реализация. Но некоторых (включая меня) гложет червь сомнения - ну не оптимально же, нехорошо молотить много тысяч из-за одной "переброски". Словом, нужно показать "технику программирования". Ну так показываем. А то там какие-то страсти с "C++ 17" (и выше), "статическая рефлексия", весь спектр оттенков вумного указателя - и еще бог весть что совсем за рамками моего понимания. А доходит до дела - молчание std::ягнят |