Скорее всего, я поступаю неправильно, но мне было интересно, есть ли у кого-нибудь совет, как отслеживать, где находится неуникальный элемент внутри вектора?
Я использую glDrawArraysInstanced и использую вектор для хранения переводов (то есть первый элемент - это перевод x, второй y, третий z, повтор), который смещает позицию конкретного экземпляра. Этот вектор помещается в буфер, и чертеж работает, как и ожидалось, с хорошим приростом производительности за счет использования экземпляров Я не хочу устанавливать позиции на основе gl_InstanceID, потому что идентификатор меняется в зависимости от количества нарисованных экземпляров, но мне нужно, чтобы экземпляры оставались согласованными.
Проблема возникает при попытке сделать число экземпляров динамическим; Мне нужно иметь возможность эффективно добавлять и удалять элементы в векторе, не перестраивая весь вектор каждый раз, когда что-то меняется. Однако я не уверен, как точно определить, где находится перевод внутри вектора.
Как пример:
- Экземпляр 0 использует переводы 0,1,2
- Экземпляр 1 использует переводы 3,4,5
- Экземпляр 2 использует переводы 6,7,8
Хотите удалить экземпляр 1:
Я могу сохранить индекс компонента x перевода, когда переводы создаются впервые, поэтому я знаю, что мне нужно удалить 3 элемента, начиная с 3.
Хотите удалить экземпляр 2:
Как узнать, что является начальным индексом для этого экземпляра? Индексы, хранящиеся во время строительства, больше не действительны.
Я знаю, что этот случай тривиален, и я могу просто вычесть из исходного сохраненного индекса, но если я скажу 40 000 экземпляров, есть ли эффективный способ всегда знать, где находится конкретный перевод для этого экземпляра в векторе? После нескольких добавлений / удалений экземпляров индексы могут сдвинуться на значительную сумму.
Примечание: я хочу использовать вектор, потому что OpenGL нужен float * для заполнения буфера. Я мог бы легко использовать карту между экземпляром и его позициями, но в какой-то момент мне все равно нужно было собрать все позиции вместе для рендеринга. Если я что-то упускаю по этому вопросу, пожалуйста, дайте мне знать. Замена буфера, похоже, не сильно влияет на производительность, но перестраивает весь вектор позиций, когда что-то меняется слишком медленно.
Надеюсь, это не слишком большая часть текста ... любая помощь будет оценена.