Потому что для того, чтобы на вашей сетке было затенение (любое, гладкое или плоское), вам нужна модель освещения, и OpenGL ES не может ее угадать. В GL ES 2 нет фиксированного конвейера, поэтому вы не можете использовать любую встроенную функцию, которая будет выполнять эту работу за вас (используя встроенную модель освещения).
При плоском затенении весь треугольник будет нарисован одним и тем же цветом, рассчитанным по углу между его нормалью и источником света (да, вам также нужен источник света, который может быть просто источником перспективного вида) , Вот почему вам нужен хотя бы один нормаль на треугольник.
Затем графический процессор работает очень параллельно, обрабатывая несколько вершин (а затем и фрагменты) одновременно. Чтобы быть эффективным, он не может делиться данными между вершинами. Вот почему вам нужно копировать нормали для каждой вершины.
Кроме того, ваша сетка больше не может делить вершины между треугольниками, как вы сказали, потому что они разделяют только положение вершины, а не нормаль вершины. Поэтому вам нужно поместить в буфер 3 * NbTriangles
вершин, каждая из которых имеет одну позицию и одну нормаль. Вы также не можете получить выгоду от использования треугольных полос / вееров, потому что ни одно из ваших лиц не будет иметь общую вершину с другой (потому что, опять же, другие нормали).