
- •4. 3. Архитектура видеоадаптеров ega и vga
- •Монитор
- •Видеопамять
- •Текстовый режим
- •Знакогенератор
- •Атрибуты символов
- •Атрибуты символов (монохромный режим)
- •Видеопамять в графических режимах
- •Режимы 4 и 5
- •Режим 6
- •Режимы 0Dh и 0Eh
- •Режим 0Fh
- •Режим 10h
- •Режим 11h
- •Режим 12h
- •Режим 13h
- •5. 7. Видеоадаптеры svga
- •Видеопамять svga
- •Слоеный пирог
- •Увидеть весь мир через замочную скважину
- •Больше цветов больше бит
- •Стандарт vesa
- •6. 11.1. Введение
- •11.2. Преобразование отрезков из векторной формы в растровую
- •Простейший пошаговый алгоритм
- •Алгоритм Брезенхэма для отрезков прямых
- •11.3. Растровая развертка литер
- •Пропорциональное размещение литер. Нижние выносные элементы
- •17,18 Введение в модели закрашивания
- •Геометрические составляющие для нахождения отраженного света.
- •Вычисление диффузионной составляющей
- •Зеркальное отражение
- •Фоновые источники и фоновые отражения
- •Комбинирование компонентов освещения
- •Добавление цвета
- •[Править] Описание алгоритма
- •0.6.1 Двумерный алгоритм Коэна-Сазерленда
- •[Править] Достоинства
- •[Править] Недостатки
- •О трассировке лучей
- •Матрицы и вектора
- •Обратная трассировка лучей Определение цвета точки. Текстурные карты и свойства материалов
- •16 15. Цвет в компьютерной графике
- •Перспективная проекция
- •10 Лекции по компьютерной графике
- •3.1. Координаты и преобразования
- •3.3. Преобразование в однородную систему координат
- •Поворот вокруг фиксированной точки
- •[Править] Отличия от ega
- •[Править] Текстовые режимы
- •[Править] Графические режимы
- •[Править] Стандартные графические режимы
- •[Править] Нестандартные графические режимы (X-режимы)
[Править] Достоинства
возможность рендеринга гладких объектов без аппроксимации их полигональными поверхностями (например, треугольниками);
вычислительная сложность метода слабо зависит от сложности сцены;
высокая алгоритмическая распараллеливаемость вычислений — можно параллельно и независимо трассировать два и более лучей, разделять участки (зоны экрана) для трассирования на разных узлах кластера и т.д;
отсечение невидимых поверхностей, перспектива и корректное изменения поля зрения являются логическим следствием алгоритма.
[Править] Недостатки
Серьёзным недостатком метода обратного трассирования является производительность. Метод растеризации и сканирования строк использует когерентность данных, чтобы распределить вычисления между пикселями. В то время как метод трассирования лучей каждый раз начинает процесс определения цвета пикселя заново, рассматривая каждый луч наблюдения в отдельности. Впрочем, это разделение влечёт появление некоторых других преимуществ, таких как возможность трассировать больше лучей, чем предполагалось для устранения контурных неровностей в определённых местах модели. Также это регулирует отражение лучей и эффекты преломления, и в целом — степень фотореалистичности изображения.
О трассировке лучей
Трассировка лучей (ray tracing) – один из самых мощных методов компьютерной графики для построения изображений. С его помощью можно получить множество эффектов, таких как преломление (refraction) и отражение (reflection), бамп-меппинг (bump-mapping), эффект размытия глубины (depth of field) и многие другие. Но построение изображения по одной точке, поиск пересечения со всеми объектами сильно замедляет работу. Существую гораздо более эффективные алгоритмы, такие как построчное сканирование (scan line), BSP-деревья, развертка с использованием z-буфера.
Рассмотрим наиболее общий алгоритм трассировки, также известный как метод фотонных карт (photon mapping).
Для получения эффектов вроде бликов лучей на поверхностях от зеркал (солнечный "зайчик") и фокусирования лучей при прохождении линзы, необходимо построения карт освещения. Для этого используется прямая трассировка. Испускаются (трассируются) лучи от источников света (чем больше тем лучше). При прохождении через полупрозрачный материал луч ослабляется и, возможно, преломляется. После пересечения с объектом мы знаем, что найденная точка освещена. В результате у каждого объекта строится карта освещения (например растр в памяти).
Следующим шагом является непосредственно построение изображения методом обратной трассировки. Выбирая очередную точку на экране, находим соответствующей вектор. Если луч в данном направлении пересекает объект, то ставим цвет точки пересечения. Для материала с отражением вызываем рекурсивно функцию определения цвета точки в направлении отраженного вектора. Аналогично для преломленного вектора в случае полупрозрачного материала.
Матрицы и вектора
Как известно из курса линейной алгебры, с помощью умножения вектора на матрицу можно выполнить различные линейные преобразования. Это и перенос, и поворот вокруг оси, и масштабирование. Основное достоинство матриц это то, что несколько последовательных преобразований в заданном порядке можно представить одной единственной матрицей.
Во всех дальнейших примерах будем полагать, что вектор у нас представлен строкой с четырьмя компонентами, а матрица, соответственно, имеет размеры 4 на 4.
В виде уравнений
Для переноса точки используется следующее преобразование
Для масштабирования (вытягивания/сжатия в направлении осей координат)
Для вращения вокруг оси X
Для вращения вокруг оси Y
Для вращения вокруг оси Z
В программе эти матрицы получаются непосредственной инициализацией.
Умножение матрицы на матрицу и вектора на матрицу также не представляют ничего сложного. Главное помнить правило умножения: элемент результирующей матрицы берется как сумма произведений соответствующих компонент строки левой матрицы на компоненты столбца правой матрицы (естественно необходимо равенство размерности строк левой матрицы и столбцов правой).
Во время преобразования иногда необходимо знать как меняются вектора без учета переноса. Например необходимо повернуть треугольник вместе со своей нормалью. В этом случае вектор умножается на матрицу как обычно, но нижняя строка матрицы берется нулевой.
Для целей трассировки иногда полезно знать обратную матрицу. Простейший способ её найти через миноры и определитель. Напомним, что минор элемента матрицы есть определитель матрицы, полученной после вычеркивания строки и столбца, содержащих данный элемент. Элемент обратной же получается как отношение минора транспонированной матрицы к определителю исходной матрицы, взятое со знаком минус, если сумма номера строки и столбца элемента является нечетной. Например так:
void ReverseMatrix(Matrix *res, const Matrix &m)
{
REAL d = m.Determinant(), k;
if (d == 0)
throw "Matrix invalid";
k = 1/d;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if ((i + j)%2 == 0)
res->m[j][i] = m.Minor(i, j)*k;
else
res->m[j][i] = - m.Minor(i, j)*k;
}
REAL Matrix::Minor(int i, int j) const
{
REAL a[3][3];
int i0, j0, i1, j1;
for (i1 = 0, i0 = 0; i1 < 3; i1++, i0++)
{
if (i0 == i)
i0++;
for (j1 = 0, j0 = 0; j1 < 3; j1++, j0++)
{
if (j0 == j)
j0++;
a[i1][j1] = m[i0][j0];
}
}
return
+ a[0][0]*a[1][1]*a[2][2] + a[0][1]*a[1][2]*a[2][0] + a[0][2]*a[1][0]*a[2][1]
- a[0][2]*a[1][1]*a[2][0] - a[0][0]*a[1][2]*a[2][1] - a[0][1]*a[1][0]*a[2][2];
}
REAL Matrix::Determinant() const
{
return
+ _00*_11*_22*_33 - _00*_11*_23*_32 - _00*_12*_21*_33 + _00*_12*_23*_31
+ _00*_13*_21*_32 - _00*_13*_22*_31 - _01*_10*_22*_33 + _01*_10*_23*_32
+ _01*_12*_20*_33 - _01*_12*_23*_30 - _01*_13*_20*_32 + _01*_13*_22*_30
+ _02*_10*_21*_33 - _02*_10*_23*_31 - _02*_11*_20*_33 + _02*_11*_23*_30
+ _02*_13*_20*_31 - _02*_13*_21*_30 - _03*_10*_21*_32 + _03*_10*_22*_31
+ _03*_11*_20*_32 - _03*_11*_22*_30 - _03*_12*_20*_31 + _03*_12*_21*_30;
}
Процедура выполняется примерно 2000 тактов. После развертка циклов нахождения миноров (без i и j) все занимает около 700 тактов (можно увидеть в исходных кодах трассировщика).