Philippe Bekaert, Mateu Sbert, and John H. Halton. Accelerating path tracing by re-using paths. In Rendering Techniques, pages 125–134, 2002
в vertexcm.hxx из SmallVCM
написано:
я же переписал этот момент так:
// Vertex connection: Connect to light vertices
if(!bsdf.IsDelta() && mUseVC)
{
// For VC, each light sub-path is assigned to a particular eye
// sub-path, as in traditional BPT. It is also possible to
// connect to vertices from any light path, but MIS should
// be revisited.
pathIdx123 = pathIdx;
// *экспериментально! range - здесь вписать пробную проверку на соседние пикселы
if(pathREUSE)
{
if(screenSample.x<(FLOAT)xx && xx>0)
pathIdx123--;
else
if(screenSample.x>(FLOAT)xx && xx<resx-1)
pathIdx123++;
if(screenSample.y<(FLOAT)yy && yy>0)
pathIdx123-=resX;
else
if(screenSample.y>(FLOAT)yy && yy<resy-1)
pathIdx123+=resX;
}
const Vec2i range(
(pathIdx123 == 0) ? 0 : mPathEnds[pathIdx123-1],
mPathEnds[pathIdx123]);
// Vertex connection: Connect to light vertices
if(!bsdf.IsDelta() && mUseVC)
{
// For VC, each light sub-path is assigned to a particular eye
// sub-path, as in traditional BPT. It is also possible to
// connect to vertices from any light path, but MIS should
// be revisited.
pathIdx123 = pathIdx;
// *экспериментально! range - здесь вписать пробную проверку на соседние пикселы
if(pathREUSE)
{
if(screenSample.x<(FLOAT)xx && xx>0)
pathIdx123--;
else
if(screenSample.x>(FLOAT)xx && xx<resx-1)
pathIdx123++;
if(screenSample.y<(FLOAT)yy && yy>0)
pathIdx123-=resX;
else
if(screenSample.y>(FLOAT)yy && yy<resy-1)
pathIdx123+=resX;
}
const Vec2i range(
(pathIdx123 == 0) ? 0 : mPathEnds[pathIdx123-1],
mPathEnds[pathIdx123]);
разница - проверять очередной семпл, к какому пикселу он ближе и использовать не самого пиксела light path, а пикселов, к которым семпл ближе.
эта техника даёт больше разброс лучей и, как пишут авторы вышеупомянутого документа,
Metropolis Light Transport - экстремальная версия описываемой техники path reuse
вот несколько результатов для сравнения:
мой небольшой вывод - даёт уменьшение шума и больше деталей. почти без затрат
отличия между изображениями незначительные, но деталей больше в reuse-версиях и они точнее.надо учитывать и центральный пиксел и соседний пропорционально.
SQRT((screenSample.x-xx)*(screenSample.x-xx)+(screenSample.y-yy)*(screenSample.y-yy)) - коэффициент для соседнего пиксела, (1-SQRT) - для центрального.
Комментариев нет:
Отправить комментарий