Обычные векторы лиц и вершин (Direct3D 9)

Каждая грань в сетке имеет перпендикулярный вектор нормы единицы, как показано на следующем рисунке. Направление вектора определяется порядком определения вершин и типом системы координат (правосторонняя или левосторонняя). Нормаль поверхности направлена от передней стороны поверхности. В Direct3D видима только передняя сторона поверхности. Передняя поверхность — та, на которой вершины определяются по часовой стрелке.

иллюстрация нормального вектора для переднего лица

Любая не передняя поверхность считается задней. Direct3D не всегда отрисовывает обратные лица; поэтому, задние лица, как говорят, выбраковываются. При необходимости можно изменить режим отбрасывания и включить отрисовку задних поверхностей. Дополнительные сведения см. в разделе Состояние отбраковки (Direct3D 9).

Direct3D использует единичные нормали вершин для затенения по методу Гуро, освещения и эффектов материалов. На следующем рисунке показаны примеры норм.

Иллюстрация норм вершин

При применении затенения по методу Гуро к полигону Direct3D использует нормали вершин для вычисления угла между источником света и поверхностью. При этом Direct3D вычисляет значения цвета и интенсивности для вершин и интерполирует их для каждой точки на всех поверхностях примитива. Direct3D вычисляет значение интенсивности света с помощью угла. Чем больше угол, тем меньше света попадает на поверхность.

Если вы создаете плоский объект, задайте для нормали вершины, чтобы они указывали перпендикулярно поверхности, как показано на следующем рисунке.

иллюстрация плоской поверхности, состоящей из двух треугольников с нормалями вершин

Однако более вероятно, что объект состоит из полос треугольников, а треугольники не являются копланарными. Существует простой способ добиться плавного затенения всех треугольников в полосе. Для этого нужно сначала рассчитать нормальный вектор поверхности для каждой полигональной поверхности, с которой связана вершина. Нормаль вершины можно настроить так, чтобы она образовывала равный угол с каждой нормалью поверхности. Однако этот метод может оказаться недостаточно эффективным для сложных примитивов.

Этот метод проиллюстрирован на следующей схеме, где показаны две поверхности, S1 и S2, с видом на их ребра сверху. Нормальные векторы поверхностей S1 и S2 показаны синим цветом. Нормальный вектор вершины показан красным цветом. Угол между нормальным вектором вершины и нормалью поверхности S1 идентичен углу между нормальную вершины и нормалью поверхности S2. При освещении и затенении этих двух поверхностей по методу Гуро между ними получается плавно затененное и закругленное ребро.

схема двух поверхностей (s1 и s2) и их нормальных векторов и вектора нормальной вершины

Если нормаль вершины тяготеет в одной из поверхностей, с которой она связана, интенсивность света для точек на этой поверхности увеличивается или уменьшается в зависимости от угла между нормалью и источником света. На следующей схеме приведен пример. Опять же, эти поверхности видны краем. Нормаль вершины тяготеет к поверхности S1, поэтому угол между ней и источником света меньше, чем в том случае, если бы углы между нормалью вершины и нормалями поверхностей были равны.

схема двух поверхностей (s1 и s2) с вектором нормальной вершины, который наклоняется к одной стороне

Вы можете использовать затенение по методу Гуро для отображения некоторых объектов с острыми ребрами в трехмерной сцене. Для этого дублируйте нормальные векторы вершин на любом пересечении граней, где требуется острый край, как показано на следующем рисунке.

Иллюстрация повторяющихся нормальных векторов вершин по острым краям

Если вы используете методы DrawPrimitive для отрисовки сцены, определите объект с острыми ребрами как список треугольников, а не полосу треугольников. Если объект определен как полоса треугольников, Direct3D считает его одним многоугольником, состоящим из нескольких треугольных поверхностей. Затенение по методу Гуро применяется как для каждой поверхности многоугольника, так и между смежными поверхностями. В результате получается объект, плавно затененный от поверхности к поверхности. Поскольку список треугольников — это многоугольник, состоящий из ряда несвязанных треугольных поверхностей, Direct3D применяет затенение по методу Гуро к каждой поверхности многоугольника. Однако оно не применяется от поверхности к поверхности. Если два или более треугольников в списке треугольников смежные, между ними видится острое ребро.

В качестве альтернативы можно перейти к плоскому затенению при отрисовке объектов с острыми ребрами. С точки зрения вычислений, это самый эффективный метод, но при его использовании некоторые объекты в сцене могут быть отрисованы не так реалистично, как объекты, затененные по методу Гуро.

Системы координат и геометрия