© Георгиевский Анатолий, 24.01.2008

Алгоритмы 3D графики

Сейчас мне кажется всё это надувательством, а когда-то казалось невероятно сложной математической задачей. Сейчас-то я понимаю, что математика в алгоритмах машинной графики отдыхает. Тезис: аппаратной реализации поддаются только простые целочисленные алгоритмы. Может сделать свой графический ускоритель?

Альфа канал, полупрозрачность

Полупрозрачность. Задача сложения пикселей с учетом прозрачности возникает, когда через фигуру переднего плана должен просвечивать задний план.

Anti-aliasing. Если край полигона (заданного в векторном виде) не полностью перекрывает пиксель, то конечный цвет пикселя должен содержать сумму цвета полигона и цвета фона. При вычислении цвета пикселя можно использовать соотношение коэффициента перекрытия пикселя по площади. C = C1*A+C2(1-A). Задача сложения цветов на краях полигонов возникает также при прорисовке шрифтов, полигонов и линий, чтобы они не выглядели ступенчатыми.

Проблема возникает, например, при сложении изображения, если оно находится на заднем плане прорисованного шрифта. Выходом из этой ситуации является добавление атрибута прозрачности (альфа - канала) к каждому пикселяю в выходном буфере. Тогда добавлять фоновое изображение можно после прорисовки переднего плана. Таким образом при создании цветных изображений цветовая палитра может содержать не три, а четыре компоненты цвета, RGB+A (альфа).

Глубина изображения

Алгоритм условно называется "буфер глубины" или "z-буфер". Представьте, что у нас есть две сколь-угодно кривые поверхности. Которые прорезают одна другую. Как принять решение какую поверхность прорисовывать, а какую нет, какая часть одной поверхности загораживает вторую поверхность?

Нас учили математике и прежде всего в голову приходит идея расчитать кривую пересечения двух поверхностей. Хорошо. Берем два фрагмента поверхностей третьего порядка и пытаемся представить форму кривой по которой происходит пересечение поверхностей. Становится страшно от обилия вариантов и сложности формул.

Воторая идея строится на упрощении проблемы выбора поверхности за счет дискретизации оси Z. Можно строить срезы фигур по оси Z. И для каждой точки принимать решение какая поверхность оказывается спереди, какая сзади.

Третья идея. Можно протыкать изображение по оси Z. Каждая проба - отдельный пиксель изображения. Из нескольких поверхностей выбираем ближнюю к наблюдателю. Опять слишком сложно, потому что для каждого фрагмента поверхности надо расчитывать проходит или нет выбранная ось через поверхность и расчитывать точку пересечения с поверхностью.

Ну и наконец сама идея алгоритма "буфера глубины". Надо каждому пикселю выходного изображения сопоставить атрибут глубины. Рисуем каждый фрагмент каждой поверхности по пикселям, всё равно в какой последовательности. Для каждого пикселя изображения перед добавленем расчитанного значения его цвета в выходной буфер производим сравнение. Если глубина пикселя, который содержится в буфере, по оси Z больше, то заменяем его новым пикселем со своим атрибутом глубины. Если глубина нового пикселя больше, то оставляем цвет и глубину старого пикселя.

Преобразование треугольников

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

Любую поверхность можно представить набором треугольников. С треугольниками проще работать. Любой полигон разбивается на треугольники. Каждому треугольнику, каждой вершине треугольника сопоставляется цвет вершины, и вектор нормали в каждой вершине.

Действие второе. Каждый треугольник состоит из горизонтальных цепочек(строк) пикселей. Для крайних точек строки можно расчитать значения нормали и цвета. Расчет каждой компоненты цвета пикселя в строке, расчет каждой компоненты нормали, расчет z-координаты пикслеля может вычисляться по линейному или слегка нелинейному закону.

Удаление невидимых поверхностей

Если знак Z-компоненты вектора нормали к поверхности в данной точке изображения минус, то мы смотрим на обратную сторону поверхности, в этом случае можно пиксель не добавлять в выходной буфер. Ещё это означает что для каждого пикселя изображения надо просчитывать вектор нормали к поверхности.

Расчет освещенности поверхности

Задача моделирования освещения сводится к расчету световых пятен и градиента освещенности. Освещенность и пятна засветки расчитываются исходя из направления нормали в каждой точке поверхности. Освещение просчитывается сразу(параллельно) для восьми источников.

Наложение текстур

...

Кто бы мне заказал проектирование графического ускорителя?

  • И чего тут сложного!?

    ()

  •