IBets
> Как ты поборолся с полосами?
> Чувствую косяк с градиентом
Очень похоже, что при расчёте градиента у тебя дельта не равна размеру вокселя.
Alexander K
Ну я считаю так.
delta = distance(BoundingBoxMin, BoundingBoxMax) / max(dimX, dimY, dimZ)
Suslik
А чего два сэмплера не завести? Один по интеполированным данным, второй точечный. Точечным через центральную разницу получить нормали и проитерполировать их.
Вот сравнение расчета нормалей с разными сэмплерами. С помощью центральной разности и последующей интерполяции
Точечный
IBets
> Ну я считаю так.
> delta = distance(BoundingBoxMin, BoundingBoxMax) / max(dimX, dimY, dimZ)
если ты хочешь, чтобы eps был равен размеру вокселя, то надо так:
vec3 eps = (aabbMax - aabbMin) / vec3( sizex, sizey, sizez);
IBets
> А чего два сэмплера не завести? Один по интеполированным данным, второй
> точечный. Точечным через центральную разницу получить нормали и
> проитерполировать их.
ты с ума сошёл, взятие объёмной функции — самая дорогая операция во всём шейдере, алгоритм пишется так, чтобы минимизировать это количество. а ты предлагаешь нормали вручную интерполировать.
Suslik
Ну делаем размен. Либо скорость либо объем данных
Suslik
Вот еще TransferFunction попробуй на тех данных. Specular в 0.04 выставил
IBets
> Вот еще TransferFunction попробуй на тех данных. Specular в 0.04 выставил
круто, спасибо. я сейчас занят прикручиванием нормального microfacet pbr BRDF'а, как раз хотел попросить у тебя transfer function'ы погонять.
Suslik
Вот попробуй пока без Important Sampling-а
Вот по этому туториалу https://habr.com/ru/post/326852/
IBets
нет уж, спасибо, я лучше сам все формулы аккуратно выведу.
моя реализация:
всё равно немного напортачил с нормализацией при преломлении через microsurface distribution, поэтому высокий roughness немного неправильно считается .__.
Suslik
Как запилить important sampling? А именно как объединить specular и diffuse.
IBets
> Как запилить important sampling? А именно как объединить specular и diffuse.
это ж самый интересный вопрос. в том пейпере от самсунга предлагается стохастическая модель, в которой луч рандомно либо отражается от поверхности по закону BRDF, либо рассеивается в объёме. я считаю их подход идеологически неверным, так как в нём слишком много свободных констант. в моём подходе свободных констант вообще нет.
я считаю, что в каждой точке пространства существует распределение микроповерхностей, при этом вероятность луча отразиться от них определяется исключительно разностью коэффициентов преломления и формулой Френеля. то есть я считаю коэф. преломления по одну сторону микроповерхности и по другую, отсюда, зная нормаль микроповерхности, можно посчитать вероятность луча отразиться от неё и преломиться. каждый луч в каждой точке либо преломляется, либо отражается — это позволяет избавиться сразу от двух волшебных констант, которые используются у самсунга.
далее вне зависимости от того, преломился луч или отразился, я также считаю его рассеивание по стандартной модели, где он рассиеивается с экспоненциально увеличивающейся вероятностью в случайном направлении.
в итоге у меня диффузного цвета в смысле ламберта вообще нету, вместо этого диффузный цвет моделируется напрямую через подповерхностное рассеивание (что он и призван аппроксимировать).
Suslik
Начал проверять и выяснилось что спекуляру плохо. По краям видно что плохо похоже френелю. Или так должно быть?
uniform sampling
importance sampling
IBets
на таком высоком glossiness вообще importance sampling должен всегда выдавать угол падения, равный углу отражения и вес = 1, это очень легко отладить и проверить. проблемы начинаются на низком glossiness (высоком roughness), когда в дело вступают веса при importance выборках. я не берусь сказать, где у тебя баг, но оба варианта, разумеется, должны сходиться к одному и тому же.
Тема в архиве.