Как смешивать цвета

В настоящее время я кодирую трассировщик лучей. Интересно, как смешать примитивный цвет со светлым цветом. Я видел много комбинаций.

Некоторые просто добавляют два цвета. Это дает мне очень странные результаты.

Некоторые умножают каждый компонент. Выглядит нормально, но в примитиве синий ({0, 0, 1}), а свет красный ({1, 0, 0}), он просто черный. Это нормальное поведение?

Я также видел режим смешивания экрана (экран (C1, C2) = C1 + C2 - C1 * C2)), который для меня более логичен, поскольку в приведенном выше случае цвета действительно будут смешиваться.

Тот же вопрос для цветов отраженных лучей: как смешать их с локальным цветом?

Дополнительный вопрос: должна ли точка на примитиве, если она не освещена, быть черной? Я видел такие вещи, как «половина цвета».


person Tangui    schedule 09.11.2010    source источник


Ответы (1)


На самом деле это намного сложнее. Свет и материал поверхности взаимодействуют по формуле, называемой двунаправленной функцией распределения отражательной способности (BRDF, для краткости), 4-мерной функцией, входными данными которой являются направление света и направление угла обзора (оба относительно нормали к поверхности, т.е. единичный вектор, перпендикулярный поверхности), и выход которого представляет собой отношение исходящего излучения в направлении взгляда к входящему излучению в направлении света.

Нет простого способа объяснить это в этом коротком месте. Возможно, вы могли бы просмотреть статью Википедии, а также ссылки на нее или даже взломать открыть приличный учебник по компьютерной графике?

Но достаточно сказать, что для многих BRDF это сродни «умножению» в том смысле, что идеально отражающая Ламбертовская чисто красная поверхность, освещенная идеально синим светом, должна выглядеть черной.

Есть несколько усложняющих факторов: Никакой реальный свет, кроме лазера, не излучает чистый основной цвет с другими компонентами, равными 0,0. (Избегайте этого, если вы хотите получить реалистичное изображение.) Никакая реальная поверхность не отражает все на одной длине волны, а остальные компоненты цвета равны 0,0. (Избегайте этого, если вы хотите получить реалистичное изображение.) На самом деле ни один материал не является полностью ламбертовским (чисто диффузным) — обычно есть некоторый зеркальный компонент, который имеет тенденцию отражать свет на поверхности, прежде чем они попадут на какой-либо нижележащий пигмент, и, следовательно, это часть отраженного света будет выглядеть как цвет света, а не поверхности. Если это не металл, в этом случае «цвет» металла влияет на отражение. Вздох. Как я уже сказал, это сложно, и вам нужно на самом деле читать по физике (а также 40 лет исследований компьютерной графики, в ходе которых все эти проблемы были решены задолго до того, как вы задумались об этой проблеме).

Дополнительный ответ («что происходит с неосвещенной точкой»): действительно неосвещенные точки должны быть черными. Но вы наверняка знали это, как и тот факт, что в любой реальной ситуации нет точки, которая не освещается (а также может быть сфотографирована). Более интересная формулировка вопроса звучит так: мои рендереры учитывают только прямые пути света от источников, а не все непрямые пути (от объекта к объекту), которые освещают более темные углы, так как же мне предотвратить это от того, чтобы стать черным? Дешевый ответ — добавить «рассеивающий» свет, который просто отбрасывает постоянное количество света повсюду. Это то, что люди делали в течение долгого времени, и это выглядело довольно фальшиво, как вы можете себе представить. Лучшим подходом является использование различных методов «глобального освещения». Поищи это. Но определенно не стоит просто «освещать его вдвое меньше», если только вы не стремитесь к очень стилистическому (в отличие от реалистичного) внешнему виду.

person Larry Gritz    schedule 11.11.2010
comment
Это выше отличного ответа. Спасибо ! - person Tangui; 13.11.2010
comment
Вы упоминаете выход BRDF как отношение входящего излучения (от направления света) к исходящему излучению в направлении взгляда. Разве результат не является отношением исходящего излучения в направлении взгляда к излучению, падающему в направлении света? - person PeteUK; 05.10.2016
comment
Да, я исправлю это. - person Larry Gritz; 06.10.2016