Нормальные векторы поверхностей и вершин
Каждая грань в сетке имеет вектор-нормаль перпендикулярной единицы. Направление вектора определяется порядком определения вершин и типом системы координат (правосторонняя или левосторонняя).
Обычный вектор перпендикулярной единицы для переднего лица
Каждая грань в сетке имеет вектор-нормаль перпендикулярной единицы. Направление вектора определяется порядком определения вершин и типом системы координат (правосторонняя или левосторонняя). Нормаль поверхности направлена от передней стороны поверхности. В Direct3D видима только передняя сторона поверхности. Передняя поверхность — та, на которой вершины определяются по часовой стрелке.
На следующей иллюстрации показан нормальный вектор для передней поверхности.
Отбрасывания лиц назад
Любая не передняя поверхность считается задней. Direct3D не всегда отрисовывает задние поверхности, и они отбрасываются. Отбрасывание задних поверхностей означает, что они не отрисовываются. При необходимости можно изменить режим отбрасывания и включить отрисовку задних поверхностей. Подробнее см. в разделе Состояние отбрасывания.
Единичные нормали вершин
Direct3D использует единичные нормали вершин для затенения по методу Гуро, освещения и эффектов материалов.
На следующей иллюстрации показаны нормали вершин.
При применении затенения по методу Гуро к полигону Direct3D использует нормали вершин для вычисления угла между источником света и поверхностью. При этом Direct3D вычисляет значения цвета и интенсивности для вершин и интерполирует их для каждой точки на всех поверхностях примитива. Direct3D вычисляет значение интенсивности света с помощью угла. Чем больше угол, тем меньше света попадает на поверхность.
Плоские поверхности
Если вы создаете плоский объект, настройте нормали вершин перпендикулярно поверхности.
На следующей иллюстрации показана плоская поверхность, составленная из двух треугольников с нормалями вершин.
Плавное затенение на неплоском объекте
Наиболее вероятно, что ваш объект не плоский и состоит из полос треугольников, и треугольники находятся в разных плоскостях. Существует простой способ добиться плавного затенения всех треугольников в полосе. Для этого нужно сначала рассчитать нормальный вектор поверхности для каждой полигональной поверхности, с которой связана вершина. Нормаль вершины можно настроить так, чтобы она образовывала равный угол с каждой нормалью поверхности. Однако этот метод может оказаться недостаточно эффективным для сложных примитивов.
Этот метод проиллюстрирован на следующей схеме, где показаны две поверхности, S1 и S2, с видом на их ребра сверху. Нормальные векторы поверхностей S1 и S2 показаны синим цветом. Нормальный вектор вершины показан красным цветом. Угол между нормальным вектором вершины и нормалью поверхности S1 идентичен углу между нормальную вершины и нормалью поверхности S2. При освещении и затенении этих двух поверхностей по методу Гуро между ними получается плавно затененное и закругленное ребро.
На следующей иллюстрации показаны две поверхности (S1 и S2), их нормальные векторы и нормальный вектор вершины.
Если нормаль вершины тяготеет в одной из поверхностей, с которой она связана, интенсивность света для точек на этой поверхности увеличивается или уменьшается в зависимости от угла между нормалью и источником света. На следующей схеме приведен пример. Поверхности изображены с видом на их ребра. Нормаль вершины тяготеет к поверхности S1, поэтому угол между ней и источником света меньше, чем в том случае, если бы углы между нормалью вершины и нормалями поверхностей были равны.
На следующей схеме показаны две поверхности (S1 и S2) с вектором нормали вершины, тяготеющим к одной из поверхностей.
Острые края
Вы можете использовать затенение по методу Гуро для отображения некоторых объектов с острыми ребрами в трехмерной сцене. Для этого продублируйте нормальные векторы вершин на любом пересечении поверхностей, где требуется острое ребро.
На следующей иллюстрации показаны дублированные нормальные векторы вершин на острых ребрах.
Если вы используете методы DrawPrimitive для отрисовки сцены, определите объект с острыми ребрами как список треугольников, а не полосу треугольников. Если объект определен как полоса треугольников, Direct3D считает его одним многоугольником, состоящим из нескольких треугольных поверхностей. Затенение по методу Гуро применяется как для каждой поверхности многоугольника, так и между смежными поверхностями.
В результате получается объект, плавно затененный от поверхности к поверхности. Поскольку список треугольников — это многоугольник, состоящий из ряда несвязанных треугольных поверхностей, Direct3D применяет затенение по методу Гуро к каждой поверхности многоугольника. Однако оно не применяется от поверхности к поверхности. Если два или более треугольников в списке треугольников смежные, между ними видится острое ребро.
В качестве альтернативы можно перейти к плоскому затенению при отрисовке объектов с острыми ребрами. С точки зрения вычислений, это самый эффективный метод, но при его использовании некоторые объекты в сцене могут быть отрисованы не так реалистично, как объекты, затененные по методу Гуро.