Объекты, сделанные из различных материалов Тщательным подбором коэффициентов отражения можно добиться того, чтобы объект выглядел - по меньшей мере приближенно - сделанным из нужного материала, например меди, золота, олова. МакРей-нолдс и Блайт [McReynolds, 139] предложили использовать коэффициенты отражения, приведенные в табл. 8.1. Отметим, что коэффициенты зеркального отражения имеют различные компоненты красного, зеленого и синего цветов, так что цвет зеркального света, вообще говоря, не будет совпадать с цветом падающего света. Однако МакРейнолдс и Блайт предупреждают пользователей, что, поскольку алгоритм закраски OpenGL использует зеркальный компонент Фонга, видимые эффекты не являются полностью реалистичными. Мы вернемся к этому вопросу в главе 14 и опишем там более реалистичный метод закрашивания Кука-Торранса (Cook-Torrance).
Визуализация граней для усиления реалистичности
Таблица 8.1. Параметры для часто используемых материалов
Материал степени 1 |
Фоновое: р„,рщ,рл |
Диффузное: р^р^'Р» |
Зеркальное: p„,p4,prt |
Показатель |
черная пластмасса |
0.0 0.0 0.0 0.01 0.01 0.01 | 0.50 0.50 0.50 | ||
Латунь |
0.329412 0.223529 0.027451 | 0.780392 0.568627 0.113725 | 0.992157 0.941176 0.807843 | 27.8974 |
Бронза |
0.2125 0.1275 0.054 | 0.714 0.4284 0.18144 | 0.393548 0.271906 0.166721 | 25.6 |
Хром |
0.25 0.25 0.25 | 0.4 0.4 0.4 | 0.774597 0.774597 0.774597 | 76.8 |
Медь |
0.19125 0.0735 0.0225 | 0.7038 0.27048 0.0828 | 0.256777 0.137622 0.086014 | 12.8 |
Золото |
0.24725 0.1995 0.0745 | 0.75164 0.60648 0.22648 | 0.6282810.555802 0.366065 | 51.2 |
Олово |
0.10588 0.058824 0.113725 | 0.4274510.470588 0.541176 | 0.3333 0.3333 0.521569 | 9.84615 |
Серебро |
0.19225 0.19225 0.19225 | 0.50754 0.50754 0.50754 | 0.508273 0.508273 0.508273 | 51.2 |
Полированное серебро |
0.23125 0.23125 0.23125 | 0.2775 0.2775 0.2775 | 0.7739110.7739110.773911 | 89.6 |
8.2.7. Закраска и графический конвейер
На каком этапе работы графического конвейера выполняется закраска? И как это делается? На рис. 8.17 вновь приводится этот конвейер. Основная идея состоит в том, что вершины сетки посылаются в конвейер вместе со связанными с ними нормалями, и все вычисления по закраске осуществляются именно с вершинами. (Напомним, что подпрограмма draw() класса Mesh с каждой вершиной передает нормаль, как показано в листинге 6.2.)