Читать книгу Цифровое моделирование на C# - Дмитрий Павлов - Страница 35

Урок 2. 3D моделирование
Способы освещения

Оглавление

Мы выяснили, как вычислять цвет в произвольной точке треугольника. Но нам необходимо закрасить весь треугольник. Чтобы это сделать, существует несколько вариантов. Первый вариант самый простой (и, соответственно, самый быстрый) – нужно вычислить цвет в произвольной точке (например, в вершине) и закрасить этим цветом весь треугольник. Второй чуть сложнее – это вычислить цвет в трех вершинах треугольника, усреднить эти значения и закрасить этим усредненным значением весь треугольник. И, наконец, третий способ – вычислить цвет в трех вершинах, а для закраски внутренних точек треугольника использовать линейную интерполяцию между вершинами треугольника (метод Гуро). Этот метод позволяет устранить дискретность изменения интенсивности, также он является наиболее ресурсоемким из трех перечисленных, но именно он дает самую качественную картину из описанных выше методов.


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


Существует еще один подход к освещению как полигональных, так и других типов моделей. Если мы умеем вычислять значение цвета для произвольной точки объекта, то можно рассчитать освещенность для каждой точки модели. Это, так называемый, метод попиксельного освещения. Понятно, что он является наиболее ресурсоемким из всех. Этот метод может применяться в областях, где скорость расчета освещенности не так важна по сравнению с качеством – например, в мультипликации, где картинки подготавливаются заранее и не так важно, как долго отрисовывался конкретный кадр.


В качестве практической вставки посмотрим, как закрасить треугольник в соответствии с методом Гуро. В графической библиотеке GDI+ присутствует необходимый функционал, чтобы линейно интерполировать цвета между тремя вершинами. (см. листинг ниже)


Цифровое моделирование на C#

Подняться наверх