Освещение создаётся при помощи точечного источника. При рендеринге в режиме "без освещения" все объекты считаются освещёнными и теней не отбрасывают.
В случае рендеринга с освещением для каждой прорисовываемой точки выполняется процедура расчета освещения её источником света. Сначала проверяется наличие, пересечения луча из точки в источник света с любым другим объектом из сцены. Если такое пересечение было найдено, то точка не освещена данным источником. Иначе, точка получает прирост освещённости по цвету и интенсивности, зависящий от источника и угла между отрезком и нормалью к треугольнику, которому принадлежит рассматриваемая точка (см. рис.1). Таким образом, создаются тени - области без дополнительного освещения. Для усиления теней рекомендуется выбирать в качестве базовых цветов модели тёмные оттенки, а для источников освещения - более яркие.
Рис. 3. Освещенность точки.
P - рассматриваемая точка
N - нормаль к поверхности
Z - вектор, ведущий от рассматриваемой точки к источнику освещения.
|
|
Обоснование выбора алгоритма.
Алгоритм трассировки лучей позволяет получить наиболее реалистичные изображения объектов сцены. Одним из свойств алгоритмов трассировки лучей заключается в большой зависимости скорости работы от разрешения экрана. Одним из главных последствий существования этой зависимости стала невозможность осуществления трассировки лучей в реальном времени на старых персональных компьютерах, оснащённых процессорами PentiumII и ниже. Эта константа даже на маленьких разрешениях - 400х300 - полностью съедала всю мощность процессора. Но сейчас этот барьер пройден. [3] Для обеспечения резкого ускорения скорости работы алгоритма необходимо использовать специальные библиотеки арифметических вычислений, оптимизированные под команды SSE. Например, уже достаточно давно доступна библиотека Small Matrix Library от компании Intel. В ней реализован класс матрица и класс вектор. По данным iXBT [3] время выполнения вычислений с учетом использования данной библиотеки на PIII 800EB выглядит следующим образом:
Операция | SSE/FPU | Время выполнения (в тактах процессора) |
3x3 * 3x1 | FPU | 31 |
3x3 * 3x1 | SSE | 29 |
Transpose (3x3) * 3x1 | SSE | 23 |
4x4 * 4x1 | FPU | 53 |
4x4 * 4x1 | SSE | 31 |
Transpose (4x4) * 4x1 | SSE | 27 |
3x3 * 3x3 | FPU | 79 |
3x3 * 3x3 | SSE | 59 |
4x4 * 4x4 | FPU | 172 |
4x4 * 4x4 | SSE | 90 |
6x6 * 6x1 | FPU | 113 |
6x6 * 6x1 | SSE | 60 |
6x6 * 6x6 | FPU | 652 |
6x6 * 6x6 | SSE | 307 |
4x4 * 4x4 (general case) | SSE | 529 |
Inverse 4x4 | FPU | 392 |
Inverse 4x4 | SSE | 209 |
Inverse 6x6 | FPU | 1118 |
Inverse 6x6 | SSE | 600 |
Ускорение получается до двух раз и даже больше. Результаты реализации без применения оптимизированных библиотек так же подчеркивают архитектурные особенности современных компонентов компьютеров, о чем будет сказано позднее. Таким образом, алгоритм трассировки лучей на текущий момент позволяет получить наиболее качественный расчет освещения в сочетании с достаточной скоростью при использовании оптимизированных под SSE библиотек, что и должно явиться следующим этапом развития программного продукта.
|
|