Поделиться через


Обычные векторы лиц и вершин

Каждое лицо в сетке имеет перпендикулярный обычный вектор единицы. Направление вектора определяется порядком, в котором определяются вершины и по правой или левой системе координат.

Перпендикулярный обычный вектор для переднего лица

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

На следующем рисунке показан обычный вектор для переднего лица:

обычный вектор для переднего лица

Отбрасывание лиц назад

Любое лицо, которое не является передним лицом является заднее лицо. Direct3D не всегда отрисовывает лица обратно; Задние лица, как говорят, выбрасываются. Обратная обработка лиц означает устранение лиц назад от отрисовки. Вы можете изменить режим выкладки, чтобы отрисовка лиц назад, если вы хотите. Дополнительные сведения см. в разделе "Состояние кулака".

Обычные единицы вершины

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

На следующем рисунке показаны нормальные вершины:

нормали вершины

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

Плоские поверхности

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

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

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

Гладкое заливка на неструктурированном объекте

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

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

На следующем рисунке показаны две поверхности (S1 и S2) и их обычные векторы и вектор вершины:

две поверхности (s1 и s2) и их обычные векторы и обычный вектор вершины

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

На следующем рисунке показаны две поверхности (S1 и S2) с нормальным вектором вершины, который склоняется к одному лицу:

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

Острые края

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

На следующем рисунке показаны повторяющиеся векторы нормальной вершины на острых краях:

дублированные векторы вершины с острыми краями

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

Результатом является объект, который плавно оттеняется от лица к лицу. Так как список треугольников представляет собой многоугольник, состоящий из ряда разрознированных треугольных лиц, Direct3D применяет заливку Гуруд по каждой стороне многоугольника. Однако он не применяется от лица к лицу. Если два или более треугольников списка треугольников находятся рядом, они, как представляется, имеют острый край между ними.

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

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