Я много читал о OpenGL, и у меня есть некоторые вопросы о "архитектуре".
Что касается ваших вопросов:
- В OpenGL есть буферы, поэтому полезно хранить данные геометрии в классе? Я могу редактировать в живых буферах OpenGL, правильно?
Это зависит от того, как часто вы собираетесь обновлять данные и тип используемого вами графического процессора. Если вы используете дискретный "настольный" графический процессор (например, NVIDIA или ATI/AMD), буферы OpenGL выделяются в памяти графической карты и редактируются (вызывая glMapBuffer
или vairants), буфер обычно требует либо копирования данных из GPU обратно в память процессора или сохранить "теневую копию" ваших данных в CPU, который отправляется на GPU после редактирования. В любом случае, вы, вероятно, понесете задержку, отредактировав данные в буфере.
Альтернативный - и, как правило, лучший способ редактирования данных - заменить часть буфера с помощью glBufferSubData
, что может помочь уменьшить эффекты сопоставления и развязки буфера для интерактивного редактирования. Для этого вызова требуется массив данных в памяти ЦП, который будет скопирован на GPU для замены данных в буфере. Объем данных, которые вы можете отправить с помощью glBufferSubData
должен быть меньше размера исходного буфера.
Что касается хранения данных в классе, если вы часто меняете данные, то ваш лучший подход, вероятно, заключается в том, чтобы сохранить локальную копию, а затем glBufferSubData
чтобы отправить ее на GPU.
- Буферы индекса OpenGL могут обрабатывать GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT и GL_UNSIGNED_INT, в моем классе, как я могу управлять этими разными типами? Мне нужно создать один вектор unsigned int, один вектор short,...?
Нет, вам нужен только один буфер наиболее подходящего типа, основанный на том, сколько вершин вам нужно индексировать. Например, вы можете получить доступ только к 256 вершинам, используя индексы GL_UNSIGNED_BYTE
.
- Полезно ли использовать unsigned int, unsigned byte и unsigned short для индексов? Я прошу об этом, потому что хранение только беззнакового короткого текста будет менее болезненным и может позволить малые и большие модели.
Еще раз, тип данных, который вы используете для индексов, действительно важен только для того, сколько вершин вы хотите получить, поэтому, если GLushort
- лучший формат хранения, пойдите для него.
То, что вы просите, - это вопрос выбора дизайна. Было бы лучше пойти на реализацию, которая соответствует вашим потребностям и изменит ее только тогда, когда вы не сможете обработать функцию. На этом этапе у вас будет что-то работающее, и будет легче вносить изменения в поддержку новых вещей. Я бы предложил использовать unsigned int
качестве индексов и буферов индекса как std::vector<unsigned int>
непосредственно в памяти для более удобного использования.
Разван.