Якщо вам потрібні лише норми на обличчя, і якщо ваші текстові тексти для обличчя суворо 0/0, 0/1, 1/0, 1/1 (або подібні до вашого макета), ви можете побудувати куб з 8 вертами і або 30 (смуга з перезапуском), або 36 (список). Отримайте нормалі та текстові слова, використовуючи постійний пошук масиву на основі SV_VertexID у вашій вершинній шейдері.
Це означає, що вам навіть не потрібно включати текстові слова або нормалі у вершинний буфер, що дасть вам ще більше економії пам’яті.
У подальшому, ви все ще можете пройти до 24 вертів за куб, але також використовувати інстанціювання. Кожен куб був би фіксованого розміру у вашому вершинному буфері (1x1x1), і ви мали б коефіцієнт масштабування та положення (якщо припустимо, що ваші куби не обертаються, матриця, якщо вони є) як дані per-instance. У випадку, що не обертається, у вас є разова вартість 24 верти, але тоді для кожного куба просто потрібно 6 поплавків, щоб повністю вказати. У обертовому випадку ви дивитесь на 16 поплавців, але навіть це суттєва економія (у цьому випадку ви більше шансів на вузьку сторону процесора на матричних перетвореннях - для не обертового корпусу, що створює матрицю на льоту ваш вершинний шейдер - навіть якщо це робиться за вершиною, настільки нерозумно швидкий, що вам навіть про це не потрібно хвилюватися).
Для текстур на обличчя просто використовуйте масив текстур. Вам, звичайно, потрібно переконатися, що кожна така текстура в масиві має однаковий розмір, і вам все одно потрібно буде зламати поточну партію, якщо масив сам потребує змін, але в іншому випадку це зробить роботу просто чудово. Додайте до свого вершинного визначення третій текстовий координат, який визначає фрагмент масиву, який потрібно використовувати для кожного обличчя.
З цим вам не потрібен GS, і він повинен працювати швидше, ніж використання одного, оскільки включена ступінь геометрії шейдера накладе додаткові накладні витрати.
У моєму двигуні є базовий код, який просто малює купу кубів за допомогою цього методу, і я можу легко пережовувати понад 300 000 кубів, зберігаючи 60 кадрів в секунду, на графічному процесорі порівняно низького рівня, і не роблячи нічого іншого для оптимізації процесу. . Справді, я ні освітлюю, ні текстурую їх, але у мене ввімкнено альфа-змішування, вимкнення фонового режиму вимкнено, і в цілому це врівноважує мою частину "не робити нічого іншого для оптимізації", тому це повинно дати вам розумне уявлення про тип Ballpark ви можете вдарити цим методом.