Как отследить индекс неуникального элемента в векторе? - PullRequest
2 голосов
/ 13 апреля 2011

Скорее всего, я поступаю неправильно, но мне было интересно, есть ли у кого-нибудь совет, как отслеживать, где находится неуникальный элемент внутри вектора?

Я использую 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 * для заполнения буфера. Я мог бы легко использовать карту между экземпляром и его позициями, но в какой-то момент мне все равно нужно было собрать все позиции вместе для рендеринга. Если я что-то упускаю по этому вопросу, пожалуйста, дайте мне знать. Замена буфера, похоже, не сильно влияет на производительность, но перестраивает весь вектор позиций, когда что-то меняется слишком медленно.

Надеюсь, это не слишком большая часть текста ... любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 апреля 2011

Вместо этого используйте «GLDrawElementsInstanced», чтобы не было необходимости изменять вектор перевода (просто переупорядочивайте индексы).

Обновление: (Реальный ответ:)

Свяжите буфер преобразования (со ВСЕМИ преобразованиями, включая невидимые экземпляры) как TBO, затем получите доступ к нему как к текстуре в шейдере. Укажите атрибут индекса для каждого экземпляра (glVertexAttribDivisor = 1), который будет использоваться в качестве координаты для выборки из текстуры перевода.

Таким образом, вам нужно будет изменить только буфер индекса и добавить новые переводы в буфер перевода. В некоторых моментах вы можете выполнить процедуру очистки буфера перевода, удалив неиспользуемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...