Вы можете вычислить «плоско-затененные» (по одной нормали на границу) нормали из геометрического шейдера. По одному на каждый треугольник, «на лету», используя перекрестные произведения. Вы не можете генерировать «гладкие» нормали таким образом, потому что GS не имеет информации о соседях.
Если сетка параметрическая (скажем, метаболлы), нормаль можно рассчитать путем выборки нескольких близлежащих значений функций. Это также можно сделать на графическом процессоре.
Вы также можете вычислить нормали в шейдере, если сетка основана на карте высот или чем-то подобном.
ЕСЛИ GPU поддерживает CUDA, OpenCL или что-то подобное, И если он может обрабатывать произвольные массивы данных, то вы, вероятно, также можете вычислять нормали на GPU, используя традиционные методы.
Кроме того, я думаю, что 5 лет назад (или около того) я увидел статью под названием что-то вроде «нормальное сглаживание на GPU» или «нормальное поколение на GPU». На первой странице у него было отражающее многоугольное сердце с плоским оттенком. К сожалению, я не могу найти эту газету, и я не совсем уверен, существует ли она (или где я ее видел). Вы можете найти его (если он существует) в документах GDC, SIGGRAPH, ATI SDK или NVidia SDK.