Если вам нужны только индивидуальные нормали, и если ваши текстовые координаты для лица строго 0/0, 0/1, 1/0, 1/1 (или похожи в соответствии с вашим макетом), то вы можете построить куб с 8 вершинами и 30 (полоса с перезапуском) или 36 (список) индексов. Извлеките нормали и текстовые координаты, используя поиск в массиве на основе SV_VertexID в вашем вершинном шейдере.
Это означает, что вам даже не нужно включать texcoords или нормали в ваш буфер вершин, что даст вам еще большую экономию памяти.
Идя дальше, вы все равно можете пройти до 24 верт на куб, но также использовать инстансинг. Каждый куб будет иметь фиксированный размер в вашем буфере вершин (1x1x1), и у вас будет коэффициент масштабирования и позиция (при условии, что ваши кубы не вращаются, если они имеют матрицу) в качестве данных для каждого экземпляра. В невращающемся случае вы получаете единовременную стоимость в 24 верта, но тогда каждому кубу нужно всего 6 поплавков, чтобы полностью указать. Во вращающемся случае вы рассматриваете 16 операций с плавающей запятой, но даже это является существенной экономией (в этом случае вы с большей вероятностью столкнетесь с узким местом на стороне процессора при матричных преобразованиях - для невращающегося случая построение матрицы на лету в ваш вершинный шейдер - даже если он сделан для каждой вершины, настолько глуп, что вам даже не нужно об этом беспокоиться).
Для текстур на лице, просто используйте массив текстур. Конечно, вы должны убедиться, что каждая такая текстура в массиве имеет одинаковый размер, и вам все равно нужно будет разбить текущий пакет, если сам массив нужно изменить, но в противном случае он отлично справится со своей задачей. Добавьте третью текстовую строку в определение вершины, которая определяет срез массива, который будет использоваться для каждой грани.
Вам не нужен GS с этим, и он должен работать быстрее, чем с ним, поскольку включение этапа геометрического шейдера налагает дополнительные издержки.
У меня есть тестовый код в моем движке, который просто рисует кучу кубов, используя этот метод, и я могу легко прожевать более 300 000 кубов, по-прежнему очищая 60 кадров в секунду, на относительно низкоуровневом графическом процессоре и ничего не делая для оптимизации процесса , По общему признанию, я не освещаю и не текстурирую их, но у меня действительно включено альфа-смешивание, отключена выборка задней поверхности, и в целом он уравновешивается с моей частью «не делать ничего для оптимизации», поэтому он должен дать вам разумное представление о виде Бейсбольный стадион вы можете поразить этим методом