Хранить индексы геометрии

0

Я много читал о OpenGL, и у меня есть некоторые вопросы о "архитектуре".

  1. В OpenGL есть буферы, поэтому полезно хранить данные геометрии в классе? Я могу редактировать в живых буферах OpenGL, правильно?
  2. Буферы индекса OpenGL могут обрабатывать GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT и GL_UNSIGNED_INT, в моем классе, как я могу управлять этими разными типами? Мне нужно создать один вектор unsigned int, один вектор short,...?
  3. Полезно ли использовать unsigned int, unsigned byte и unsigned short для индексов? Я прошу об этом, потому что хранение только беззнакового короткого текста будет менее болезненным и может позволить малые и большие модели.
Теги:
architecture
opengl

2 ответа

2

Что касается ваших вопросов:

  1. В OpenGL есть буферы, поэтому полезно хранить данные геометрии в классе? Я могу редактировать в живых буферах OpenGL, правильно?

Это зависит от того, как часто вы собираетесь обновлять данные и тип используемого вами графического процессора. Если вы используете дискретный "настольный" графический процессор (например, NVIDIA или ATI/AMD), буферы OpenGL выделяются в памяти графической карты и редактируются (вызывая glMapBuffer или vairants), буфер обычно требует либо копирования данных из GPU обратно в память процессора или сохранить "теневую копию" ваших данных в CPU, который отправляется на GPU после редактирования. В любом случае, вы, вероятно, понесете задержку, отредактировав данные в буфере.

Альтернативный - и, как правило, лучший способ редактирования данных - заменить часть буфера с помощью glBufferSubData, что может помочь уменьшить эффекты сопоставления и развязки буфера для интерактивного редактирования. Для этого вызова требуется массив данных в памяти ЦП, который будет скопирован на GPU для замены данных в буфере. Объем данных, которые вы можете отправить с помощью glBufferSubData должен быть меньше размера исходного буфера.

Что касается хранения данных в классе, если вы часто меняете данные, то ваш лучший подход, вероятно, заключается в том, чтобы сохранить локальную копию, а затем glBufferSubData чтобы отправить ее на GPU.

  1. Буферы индекса OpenGL могут обрабатывать GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT и GL_UNSIGNED_INT, в моем классе, как я могу управлять этими разными типами? Мне нужно создать один вектор unsigned int, один вектор short,...?

Нет, вам нужен только один буфер наиболее подходящего типа, основанный на том, сколько вершин вам нужно индексировать. Например, вы можете получить доступ только к 256 вершинам, используя индексы GL_UNSIGNED_BYTE.

  1. Полезно ли использовать unsigned int, unsigned byte и unsigned short для индексов? Я прошу об этом, потому что хранение только беззнакового короткого текста будет менее болезненным и может позволить малые и большие модели.

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

  • 0
    +1 : Но что касается использования «наиболее подходящего типа», основанного на количестве вершин, я должен добавить, что настольные графические процессоры не способны использовать 8-битный индекс для кеша после T & L (они поддерживают только 16/32) -немного). Обычно это означает, что если вы используете 8-битный массив элементов, то драйвер будет дополняет элементы до 16-битных во время выполнения, и вы не сохраняете память в долгосрочной перспективе и только добавляете дополнительную работу. для водителя. В D3D 8-битные индексы даже не поддерживаются, и я думаю на встроенных графических устройствах, поддерживает ли их аппаратное обеспечение или нет, это намного больше серой области.
0

То, что вы просите, - это вопрос выбора дизайна. Было бы лучше пойти на реализацию, которая соответствует вашим потребностям и изменит ее только тогда, когда вы не сможете обработать функцию. На этом этапе у вас будет что-то работающее, и будет легче вносить изменения в поддержку новых вещей. Я бы предложил использовать unsigned int качестве индексов и буферов индекса как std::vector<unsigned int> непосредственно в памяти для более удобного использования.

Разван.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню