Из того, что я прочитал, каждая вершина, хранящаяся в VBO, займет 64 байта.
Это может занять столько байтов, сколько вы хотите, в зависимости от формата вершины.
position + normal + texcoords = 4 * (3 + 3 + 2) = 32 байта на вершину
позиция + нормаль + текскорды + касательный вектор (для удара) = 4 * (3 + 3 + 2 + 3) = 44 байта
Это не означает, что каждая вершина может нуждаться в хранении несколько раз для каждого треугольника.
Одинаковые вершины не должны храниться несколько раз. Используйте индексированные примитивы (списки треугольников или полосы треугольников). Привязать буфер для указателей, затем использовать glDrawElements и glDrawRangeElements . Имейте в виду, что в OpenGL вы можете использовать четырехугольники - вам не нужно использовать только треугольники.
(4096x4096x64)
Вам не нужно создавать квад для каждого пикселя на карте. Некоторые области абсолютно плоские (то есть высота не изменяется), поэтому добавление дополнительных треугольников приведет к пустой трате ресурсов. Если вы добавите какой-то алгоритм упрощения сетки к готовому ландшафту, вы сможете отбросить довольно много треугольников. Кроме того, слишком много полигонов приведут к проблемам - треугольник или квад должны занимать несколько пикселей. Если есть несколько примитивов, которые должны занимать один и тот же пиксель, результат рендеринга будет немного «шумным». Так что вам придется учитывать желаемый уровень детализации.
Проблема, с которой я сталкиваюсь, заключается в том, что большинство источников заявляют, что размер одного VBO должен составлять от 1 до 4 МБ, и чем меньше VBO, тем лучше.
Я бы не стал доверять каждому источнику, особенно в Интернете. Многие люди, пишущие учебные пособия, далеко не "эксперты". Другое дело, что в DirectX (не OpenGL) рекомендуется по возможности помещать все (т.е. все объекты с совместимым форматом вершин) в один большой статический буфер вершин (аналог VBO) и избегать переключения буферов уменьшить нагрузку на процессор при рендеринге звонков. Так что совет, что «VBO не должно быть больше 4 МБ» выглядит для меня крайне подозрительно.
Информация может быть достоверной только , если она поступает от разработчика API или от разработчика драйверов (ATI или NVidia). Или когда абсолютно уверен, что автор (учебника или статьи) имеет большой опыт в этой области, а не другой бестолковый разработчик игр-подражателей. Документы, которые приходят из GDC, Siggraph, ATI, NVidia, могут быть доверенными. Некоторое учебное пособие, написанное анонимным "кто-то", должно быть проверено на правильность.
В любом случае, в отношении производительности у Microsoft было два документа:
«Основные проблемы заголовков Windows»
«Оптимизация производительности (Direct3D 9)» (DirectX, но некоторые советы могут быть применимы к OpenGL).
Кроме того, NVidia имеет коллекцию ресурсов OpenGL , которые включают служебные программы, связанные с производительностью ( GLexpert может быть вам полезно, а также есть NVIdia OpenGL SDK и т. Д.). В общем, когда вы пытаетесь улучшить производительность, попробуйте другие методы и измерьте результаты, а не слепо следуйте чьему-либо совету. Посмотрите, сколько дополнительных кадров в секунду вы получаете, используя ту или иную технику.
Тем не менее, согласно моим расчетам, хранение каждой вершины заняло бы около гигабайта данных! (4096x4096x64)
Это правильно, если вы построите всю карту таким образом. Но нет никакой причины загружать всю карту сразу, поэтому вам просто нужен сразу видимый кусок карты.
Я смотрю на такие игры, как Oblivion или Fallout 3, и, в некоторой степени, на Boundless Planet, и вижу огромные ландшафты, и удивляюсь, как на земле это может быть возможно.
Они не загружают все сразу.В любой момент времени загружаются только видимые объекты, текущий «кусок» ландшафта и низкополигональная версия нескольких кусков близлежащего ландшафта.В игре хранятся только те объекты, которые используются в настоящее время или будут использоваться в ближайшее время.Он постоянно получает данные с жесткого диска.