Интеграция нескольких образцов Raymarching
Допустим, я использую raymarching для рендеринга функции поля. (Это на процессоре, а не на графическом процессоре.) У меня есть алгоритм, подобный этому грубо написанному псевдокоду:
pixelColour = arbitrary;
pixelTransmittance = 1.0;
t = 0;
while (t < max_view_distance) {
point = rayStart + t*rayDirection;
emission, opacity = sampleFieldAt(point);
pixelColour, pixelTransmittance =
integrate(pixelColour, pixelTransmittance, emission, absorption);
t = t * stepFactor;
}
return pixelColour;
Логика все действительно проста... но как же integrate()
Работа?
Каждый образец фактически представляет объем в моем поле, а не точку, хотя образец берется в точке; поэтому влияние на конечный цвет пикселя будет варьироваться в зависимости от размера объема.
Я не знаю, как это сделать. Я осмотрелся вокруг, но в то время как я нашел много кода, который делает это (обычно на Shadertoy), все это делает по-другому, и я не могу найти объяснения почему. Как это работает, и, что более важно, какие магические поисковые запросы позволят мне найти его в Google?
1 ответ
Это закон Бера-Ламберта, который регулирует исчезновение через участие однородных СМИ. Не удивительно, что я не смог найти ни одного ключевого слова, которое сработало.
Здесь есть хорошая рецензия, которая рассказывает мне почти все, что мне нужно знать, хотя она довольно затуманивает вычисление фазовых функций. Но, по крайней мере, теперь я знаю, что читать дальше.