Введение в поверхностные нормы
Чтобы по-настоящему объяснить, как работает нормальное отображение, мы сначала описаем, что такое “нормальное” и как оно используется в освещении в реальном времени. Возможно, самым простым примером будет модель, в которой каждый поверхностный многоугольник освещается просто в соответствии с углами поверхности относительно света. Угол поверхности может быть представлен как линия, выступающая в перпендикулярном направлении от поверхности, и это направление (которое является вектором) относительно поверхности называется “поверхностной нормой”, или просто, нормой.
На рисунке выше левый цилиндр имеет основную плоскую затененность, и каждый многоугольник затенен в соответствии с его относительным углом к источнику света. Освещение на каждом многоугольнике является постоянным по всей площади многоугольника, потому что поверхность плоская. Здесь показаны те же два цилиндра, с видимой сеткой:
Модель справа имеет такое же количество многоугольников, как и модель слева, однако затенение выглядит гладким — освещение через многоугольники создает впечатление изогнутой поверхности. Почему это так? Причина в том, что поверхность нормальная в каждой точке, используемой для отражения света, постепенно меняется по ширине многоугольника, так что для любой данной точки на поверхности свет отражается как будто эта поверхность была изогнута а не плоский постоянный многоугольник, каким он на самом деле является.
В виде диаграммы 2D три поверхностных многоугольника вокруг внешней поверхности цилиндра с плоской затенённостью выглядят следующим образом:
Нормы поверхности представлены оранжевыми стрелками. Эти значения используются для расчета того, как свет отражается от поверхности, так что вы можете увидеть, что свет будет реагировать одинаково по всей длине каждого многоугольника, потому что нормы поверхности указывают в одном направлении. Это дает «плоское затенение», и это причина, по которой многоугольники левого цилиндра выглядят, как если бы у них были жесткие края.
Однако для гладкого затененного цилиндра поверхностные нормы варьируются по плоским многоугольникам, как показано здесь:
Нормальные направления постепенно изменяются по плоской поверхности многоугольника, так что затенение по поверхности создает впечатление гладкой кривой (представленной зеленой линией). Это не влияет на фактическую полигональную природу сетки, только на то, как рассчитывается освещение на плоских поверхностях. Эта видимая изогнутая поверхность на самом деле не присутствует, и просмотр поверхностей под углом взгляда раскроет истинную природу плоских многоугольников, однако с большинства углов просмотра цилиндр кажется имеющим гладкую изогнутую поверхность.
Используя это базовое гладкое затенение, данные, определяющие нормальное направление, на самом деле хранятся только на вершину, так что изменяющиеся значения по поверхности интерполируются от одной вершины к следующей. На диаграмме выше красные стрелки указывают на сохраненное нормальное направление в каждой вершине, а оранжевые стрелки указывают примеры интерполированных нормальных направлений по площади многоугольника.