Во-первых, на вашей картинке диагонали фактически перевернуты, если числа представляют порядок вершин (но это незначительная ошибка представления).
Это самый простой и в большинстве случаев достаточный подход для удаления более или менее однородной сетки вершин. Вы правы, в том, что 10 и 3 нуждаются в одинаковом нормале, поэтому вам нужно дать им одинаковое нормальное значение, чтобы они горели правильно. В этом случае индексация - ваш друг. Просто используйте одну вершину для 3 и 10 (с соответствующей нормалью) и используйте индексированную треугольную полосу, где индексы 3 и 10 ссылаются на одну и ту же вершину. Это стандартный способ разрешения неоднозначностей вершин. Если вы не знаете, что я имею в виду, углубитесь в программирование на OpenGL и 3D в целом, особенно в массивы вершин и индексов.
Для обычных сеток полосы часто являются хорошей идеей, потому что их можно довольно легко построить. В настоящее время для более сложных сеток это больше не требуется, так как зачастую более важно уменьшить количество вызовов отрисовки.
Они должны иметь, по крайней мере, разумную длину по сравнению с общим числом треугольников, в противном случае накладные расходы на рисование одной полосы просто перевешивают время, потраченное на немного более быструю обработку вершин, но фактические числа сильно зависят от реализации. В любом случае, вы должны использовать массивы / буферы вершин, держитесь подальше от начала / конца, если вам нужна производительность.
Вы можете фактически объединить несколько полос в одну, введя вырожденные треугольники, которые не отображаются (чтобы уменьшить количество вызовов отрисовки). Ваш пример может быть представлен в виде следующей одиночной полосы:
1, 2, 3, 4, 5, 6, 6, 7 , 7, 8, 9, 10, 11, 12
Но, опять же, помните ответ 3. Полоски должны иметь разумный размер, чтобы вырожденные треугольники не перевешивали настоящие треугольники.