Это правильный способ реализации Закона Бера?

11

Когда я реализую закон Бера (поглощение цвета на расстоянии через объект), он почему-то никогда не выглядит очень хорошо.

Когда у меня есть цвет позади объекта, я вычисляю скорректированный цвет следующим образом:

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

Это даст мне что-то похожее на это (обратите внимание на небольшое преломление): введите описание изображения здесь

И здесь это без преломления: введите описание изображения здесь

Обратите внимание , что это реализуется как игрушка шейдерного здесь .

Это соответствует описанию того, что делает закон Бера, но выглядит не очень хорошо, по сравнению с такими снимками: введите описание изображения здесь

Не обращая внимания на блики, я пытаюсь выяснить разницу. Может ли быть так, что моя геометрия слишком проста, чтобы действительно хорошо ее показать? Или я неправильно это реализую?

Алан Вульф
источник
2
Однако вы сравниваете куб с более сложной сеткой. Почему бы не повторить тот же сценарий? Модель Сьюзен легко получить.
Барт
Это не так просто в шейдерной реализации! (:
Алан Вулф
2
Ваш кубик выглядит правильно для меня: становитесь более прозрачным по мере приближения к краям. Если вы можете сделать полноценную Сюзанну, сфера должна, по крайней мере, дать лучшее приближение вида на другой картинке.
юрикс
1
Я не могу отделить преломление от затухания. Можете ли вы сделать куб с IOR = 1.0, пожалуйста?
Imallett
1
@AlanWolfe Ваш IOR = 1 рендер выглядит именно так, как я и ожидал, и я просмотрел шейлертой импл, и он выглядит хорошо.
Ималлетт

Ответы:

12

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

В действительности, когда свет входит в стекло из воздуха, он часто не сразу выходит из стекла. Это происходит потому, что когда свет падает на поверхность раздела стекло / воздух, может возникнуть явление, известное как полное внутреннее отражение (TIR). МДП возникает, когда свет распространяется от среды с более высоким показателем преломления (IOR) к среде с более низким IOR, что в точности и происходит в случае попадания света на внутреннюю стенку стеклянного объекта. Это изображение из Википедии является хорошей визуальной демонстрацией того, как оно выглядит, когда оно происходит:

полное внутреннее отражение

В общих чертах, это означает, что если свет падает под небольшим углом, свет будет полностью отражаться от внутренней части среды. Чтобы учесть это, вам нужно оценить уравнения Френелякаждый раз, когда ваш луч света попадает на поверхность раздела стекло / воздух (AKA - внутренняя поверхность вашей сетки). Уравнения Френеля подскажут вам отношение отраженного света к количеству преломленного света, а в случае МДП - 1. Затем вы можете рассчитать соответствующие направления отраженного и преломленного света и продолжить отслеживать путь света либо через среду, либо за ее пределами. Если принять простую выпуклую сетку с равномерным коэффициентом рассеяния, то расстояние, используемое для закона Бера, будет суммой всех внутренних длин пути до выхода из среды. Вот как выглядит куб с вашими коэффициентами рассеяния и IOR 1,526 (натриево-натриевое стекло), визуализированными с использованием моего собственного трассировщика пути, который учитывает как внутренние, так и внешние отражения и преломления:

стеклянный куб с трассировкой

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

ДСМ
источник
1
Here is what a cube looks like (...) using my own path tracer. Вы случайно не получили его из открытых источников?
WIP
2
Нет, не сейчас. Я планировал закончить и выпустить этот конкретный вариант вместе с сообщением в блоге о рендеринге стекла, но это было в моем отставании некоторое время.
MJP