Рассчитайте нормали для каждого лица (треугольника) и сохраните его где-нибудь. Теперь для каждой вершины у вас есть несколько граней, которые разделяют вершину (типично 6 на вашей картинке). Ваша последняя нормаль вершины - это среднее от нормалей граней. Для 6 лиц вы рассчитываете:
int faceCount = 6;
float sum = 0.0f;
for(int face = 0; face < faceCount; ++face)
sum += faceNormals[face].x;
normal.x = sum / faceCount;
// and so on for y and z
Не забудьте нормализовать результирующий вектор, чтобы его длина равнялась 1.
ПРИМЕЧАНИЕ. Не помещайте faceNormals
в такой массив. В реальном коде вы, вероятно, захотите иметь один vector
-подобный контейнер со всеми нормалями и некоторую логику, говорящую о том, какие нормали актуальны для какой вершины.