러시안 룰렛이 정말 답입니까?


21

Path Tracing의 일부 구현에서 Russian Roulette라는 접근 방식이 일부 경로를 컬링하고 다른 경로 사이에 기여를 공유하는 데 사용됩니다.

나는 기여도의 특정 임계 값 아래로 떨어질 때까지 경로를 따르는 것이 아니라 그것을 버릴 때까지 다른 임계 값이 사용되며 기여도가 해당 임계 값보다 낮은 경로는 약간의 확률로 종료된다는 것을 이해합니다. 다른 경로는 종료 된 경로에서 손실 된 에너지를 공유하는 것에 해당하는 양만큼 기여도가 증가합니다. 이것이 기술에 의해 도입 된 편향을 교정 해야하는지, 또는 바이어스를 피하기 위해 전체 기술 자체가 필요한지 여부는 분명하지 않습니다.

  • 러시아 룰렛은 편견없는 결과를 제공합니까?
  • 편견없는 결과에 러시아 룰렛이 필요 합니까?

즉, 작은 임계 값을 사용하고 해당 임계 값 아래로 떨어질 때 경로를 종료하면 더 편향되거나 편향이 적은 결과를 얻을 수 있습니까?

임의로 많은 수의 샘플이 주어지면 두 방법 모두 편견이없는 결과 이미지에 수렴됩니까?

러시아 룰렛 접근법을 사용하는 근본적인 이유를 이해하려고합니다. 속도 나 품질에 큰 차이가 있습니까?


나는 총 에너지를 보존하기 위해 다른 광선 사이에 에너지가 재분배된다는 것을 이해합니다. 그러나 광선이 해당 임계 값에 도달 한 후 임의로 결정된 수명을 갖기보다는 고정 임계 값 아래로 떨어질 때 종료되면이 재분배를 여전히 수행 할 수 없습니까?

반대로, 에너지를 재분배하지 않고 광선을 종료하여 손실 될 에너지가 결국 어쨌든 손실되면 (재분배되는 광선도 결국 종료 됨) 어떻게 상황이 개선됩니까?

답변:


26

러시아어 룰렛을 이해하기 위해 매우 기본적인 역방향 경로 추적기를 살펴 보겠습니다.

void RenderPixel(uint x, uint y, UniformSampler *sampler) {
    Ray ray = m_scene->Camera.CalculateRayFromPixel(x, y, sampler);

    float3 color(0.0f);
    float3 throughput(1.0f);

    // Bounce the ray around the scene
    for (uint bounces = 0; bounces < 10; ++bounces) {
        m_scene->Intersect(ray);

        // The ray missed. Return the background color
        if (ray.geomID == RTC_INVALID_GEOMETRY_ID) {
            color += throughput * float3(0.846f, 0.933f, 0.949f);
            break;
        }

        // We hit an object

        // Fetch the material
        Material *material = m_scene->GetMaterial(ray.geomID);
        // The object might be emissive. If so, it will have a corresponding light
        // Otherwise, GetLight will return nullptr
        Light *light = m_scene->GetLight(ray.geomID);

        // If we hit a light, add the emmisive light
        if (light != nullptr) {
            color += throughput * light->Le();
        }

        float3 normal = normalize(ray.Ng);
        float3 wo = normalize(-ray.dir);
        float3 surfacePos = ray.org + ray.dir * ray.tfar;

        // Get the new ray direction
        // Choose the direction based on the material
        float3 wi = material->Sample(wo, normal, sampler);
        float pdf = material->Pdf(wi, normal);

        // Accumulate the brdf attenuation
        throughput = throughput * material->Eval(wi, wo, normal) / pdf;


        // Shoot a new ray

        // Set the origin at the intersection point
        ray.org = surfacePos;

        // Reset the other ray properties
        ray.dir = wi;
        ray.tnear = 0.001f;
        ray.tfar = embree::inf;
        ray.geomID = RTC_INVALID_GEOMETRY_ID;
        ray.primID = RTC_INVALID_GEOMETRY_ID;
        ray.instID = RTC_INVALID_GEOMETRY_ID;
        ray.mask = 0xFFFFFFFF;
        ray.time = 0.0f;
    }

    m_scene->Camera.FrameBuffer.SplatPixel(x, y, color);
}

IE. 장면 주위를 튀기면서 색상과 빛의 감쇠를 축적합니다. 수학적으로 완전히 편향되지 않게하려면 바운스 무한대로 이동해야합니다. 그러나 이것은 비현실적이며, 언급했듯이 시각적으로 필요하지 않습니다. 대부분의 장면에서 특정 반송파 수 (예 : 10) 후에는 최종 색상에 대한 기여 량이 매우 적습니다.

따라서 컴퓨팅 리소스를 절약하기 위해 많은 경로 추적 프로그램이 이탈 수에 대한 제한이 있습니다. 이것은 편견을 추가합니다.

즉, 그 하드 한계가 무엇인지 선택하기가 어렵습니다. 일부 장면은 2 회 바운스 후 멋지게 보입니다. 다른 것 (예 : 전송 또는 SSS)은 최대 10 또는 20을 차지할 수 있습니다. 디즈니 빅 히어로 6의 바운스 디즈니의 빅 히어로 6에서 9 바운스

너무 낮게 선택하면 이미지가 눈에 띄게 편향됩니다. 그러나 너무 높게 선택하면 계산 에너지와 시간이 낭비됩니다.

이 문제를 해결하는 한 가지 방법은 감쇠 임계 값에 도달 한 후 경로를 종료하는 것입니다. 이것은 또한 편견을 추가합니다.

임계 값 이후 클램핑은 작동 하지만 다시 임계 값을 어떻게 선택합니까? 너무 크게 선택하면 이미지가 눈에 띄게 바이어스되고 너무 작아 져 리소스를 낭비하게됩니다.

Russian Roulette는 이러한 문제를 편견없이 해결하려고 시도합니다. 먼저 코드는 다음과 같습니다.

void RenderPixel(uint x, uint y, UniformSampler *sampler) {
    Ray ray = m_scene->Camera.CalculateRayFromPixel(x, y, sampler);

    float3 color(0.0f);
    float3 throughput(1.0f);

    // Bounce the ray around the scene
    for (uint bounces = 0; bounces < 10; ++bounces) {
        m_scene->Intersect(ray);

        // The ray missed. Return the background color
        if (ray.geomID == RTC_INVALID_GEOMETRY_ID) {
            color += throughput * float3(0.846f, 0.933f, 0.949f);
            break;
        }

        // We hit an object

        // Fetch the material
        Material *material = m_scene->GetMaterial(ray.geomID);
        // The object might be emissive. If so, it will have a corresponding light
        // Otherwise, GetLight will return nullptr
        Light *light = m_scene->GetLight(ray.geomID);

        // If we hit a light, add the emmisive light
        if (light != nullptr) {
            color += throughput * light->Le();
        }

        float3 normal = normalize(ray.Ng);
        float3 wo = normalize(-ray.dir);
        float3 surfacePos = ray.org + ray.dir * ray.tfar;

        // Get the new ray direction
        // Choose the direction based on the material
        float3 wi = material->Sample(wo, normal, sampler);
        float pdf = material->Pdf(wi, normal);

        // Accumulate the brdf attenuation
        throughput = throughput * material->Eval(wi, wo, normal) / pdf;


        // Russian Roulette
        // Randomly terminate a path with a probability inversely equal to the throughput
        float p = std::max(throughput.x, std::max(throughput.y, throughput.z));
        if (sampler->NextFloat() > p) {
            break;
        }

        // Add the energy we 'lose' by randomly terminating paths
        throughput *= 1 / p;


        // Shoot a new ray

        // Set the origin at the intersection point
        ray.org = surfacePos;

        // Reset the other ray properties
        ray.dir = wi;
        ray.tnear = 0.001f;
        ray.tfar = embree::inf;
        ray.geomID = RTC_INVALID_GEOMETRY_ID;
        ray.primID = RTC_INVALID_GEOMETRY_ID;
        ray.instID = RTC_INVALID_GEOMETRY_ID;
        ray.mask = 0xFFFFFFFF;
        ray.time = 0.0f;
    }

    m_scene->Camera.FrameBuffer.SplatPixel(x, y, color);
}

러시아어 룰렛은 처리량과 반비례 할 확률로 경로를 임의로 종료합니다. 따라서 장면에 많은 영향을 미치지 않는 처리량이 적은 경로는 종료 될 가능성이 높습니다.

우리가 거기서 멈춰도 여전히 편견입니다. 우리는 우리가 무작위로 끝내는 길의 에너지를 잃어 버립니다. 이를 편향시키지 않기 위해 종료되지 않은 경로의 에너지를 종료 확률로 높입니다. 이것은 무작위로, 러시아 룰렛을 편견으로 만듭니다.

마지막 질문에 대답하려면 :

  1. 러시아 룰렛은 편견없는 결과를 제공합니까?
  2. 편견없는 결과에 러시아 룰렛이 필요합니까?
    • 편견없는 의미에 따라 다릅니다. 수학적으로 의미한다면, 그렇습니다. 그러나 시각적으로 의미한다면, 아닙니다. 최대 경로 깊이와 컷오프 임계 값을 매우 신중하게 선택하면됩니다. 장면마다 바뀔 수 있기 때문에 매우 지루할 수 있습니다.
  3. 고정 확률 (컷오프)을 사용한 다음 '손실 된'에너지를 재분배 할 수 있습니까? 이 편견이 있습니까?
    • 고정 확률을 사용하면 편향이 추가됩니다. '잃어버린'에너지를 재분배함으로써 바이어스를 줄일 수 있지만 여전히 수학적으로 바이어스됩니다. 완전히 편향되지 않으려면 무작위 여야합니다.
  4. 재분배하지 않고 광선을 종료하여 손실되는 에너지가 어쨌든 결국 (분배되는 광선도 결국 종료 됨) 손실되면 어떻게 상황이 개선됩니까?
    • 러시아어 룰렛은 수신 거부 만 중지합니다. 샘플을 완전히 제거하지는 않습니다. 또한 '잃어버린'에너지는 종료까지의 반송에서 설명됩니다. 따라서 에너지가 '결국 어쨌든 손실'되는 유일한 방법은 완전히 검은 방을 갖는 것입니다.

결국 Russian Roulette는 매우 적은 양의 추가 계산 리소스를 사용하는 매우 간단한 알고리즘입니다. 그 대가로 많은 양의 계산 리소스를 절약 할 수 있습니다. 따라서 실제로 사용 하지 않는 이유를 알 수 없습니다 .


솔직히 나는 확실하지 않다 to be completely unbiased it must be random. 러시아 룰렛이 부과하는 이진 패스 / 드롭이 아니라 샘플의 분수 적 조각을 사용하여 여전히 수학 결과를 얻을 수 있다고 생각합니다. 룰렛은 완벽한 중요성 샘플링을 운영하기 때문에 룰렛이 더 빨리 수렴한다는 것입니다.
v.oddou

9

러시아 룰렛 기술 자체는 체계적인 편견을 도입하지 않고 경로를 종료하는 방법입니다. 원칙은 매우 간단합니다. 특정 정점에서 임의로 에너지를 0으로 바꿀 확률이 10 %이고 무한정 횟수를하면 에너지가 10 % 줄어 듭니다. 에너지 부스트는이를 보완합니다. 경로 종료로 인해 손실 된 에너지를 보상하지 않으면 러시아어 룰렛이 바이어스되지만 전체 기술은 바이어스를 피하는 유용한 방법입니다.

만약 내가 기여도가 작은 고정 값보다 작은 터미네이션 경로가 바이어스되어 있음을 증명하고자하는 적이라면, 나는 기여하는 패스가 항상 그 값보다 작을 정도로 너무 희미한 장면을 구성 할 것입니다. 어쩌면 저조도 카메라를 시뮬레이션하고 있습니다.

물론 고정 값을 사용자에게 조정 가능한 매개 변수로 항상 노출시킬 수 있으므로 장면이 어두워지면 더 떨어질 수 있습니다. 따라서이 예를 잠시 무시하십시오.

포물선 반사기에 의해 수집 된 매우 낮은 에너지 경로로 조명되는 물체를 고려하면 어떻게됩니까 ? 낮은 에너지 경로가 반드시 무시할 수있는 방식으로 무차별 적으로 튀어 오르는 것은 아닙니다 . 예를 들어 고정 된 수의 바운스 후 경로를 자르는 것과 같은 추론이 적용됩니다. 객체를 치기 전에 일련의 20 개의 거울을 반사하는 경로로 장면을 구성 할 수 있습니다.

그것을 보는 또 다른 방법 : 경로가 고정 엡실론 아래로 떨어진 후 경로의 기여를 0으로 설정하면 에너지 손실을 어떻게 교정합니까? 단순히 총 에너지를 일부만 줄이는 것이 아닙니다. 다른 요인, 즉 사고 에너지를 알기 전에 일부 기여 임계 값 에서 차단하기 때문에 무시하고있는 에너지 량에 대해서는 아무것도 모릅니다.


8

다른 답변 중 일부를 확장하기 위해 Russian Roulette가 편향 된 결과를 제공하지 않는다는 증거는 매우 간단합니다.

에프

에프=에프1++에프

각 용어를 다음과 같이 바꾸십시오.

에프나는'={1나는에프나는확률로 나는0그렇지 않으면

그때:

이자형[에프나는']=나는×1나는이자형[에프나는]+(1나는)×0=이자형[에프나는]

나는에프

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.