Rastreamento de caminho - Path tracing

Uma imagem renderizada usando traçado de caminho, demonstrando características notáveis ​​da técnica

Traçado de caminho é um método de computação gráfica de Monte Carlo para renderizar imagens de cenas tridimensionais de forma que a iluminação global seja fiel à realidade. Fundamentalmente, o algoritmo está integrando toda a iluminância que chega a um único ponto na superfície de um objeto. Essa iluminância é então reduzida por uma função de refletância de superfície ( BRDF ) para determinar quanto dela irá para a câmera do ponto de vista. Este procedimento de integração é repetido para cada pixel na imagem de saída. Quando combinado com modelos fisicamente precisos de superfícies, modelos precisos de fontes de luz reais (lâmpadas) e câmeras opticamente corretas, o rastreamento de caminho pode produzir imagens estáticas que não podem ser distinguidas das fotografias.

O traçado de caminho simula naturalmente muitos efeitos que precisam ser especificamente adicionados a outros métodos ( traçado de raio convencional ou renderização de linha de varredura ), como sombras suaves , profundidade de campo , desfoque de movimento , cáusticos , oclusão de ambiente e iluminação indireta. A implementação de um renderizador incluindo esses efeitos é correspondentemente mais simples. Uma versão estendida do algoritmo é realizada por traçado de caminho volumétrico , que considera a dispersão de luz de uma cena.

Devido à sua precisão e natureza imparcial , o rastreamento de caminho é usado para gerar imagens de referência ao testar a qualidade de outros algoritmos de renderização . Para obter imagens de alta qualidade a partir do rastreamento de caminhos, um grande número de raios deve ser rastreado para evitar artefatos ruidosos visíveis .

História

A equação de renderização e seu uso em computação gráfica foi apresentada por James Kajiya em 1986. O rastreamento de caminho foi introduzido então como um algoritmo para encontrar uma solução numérica para a integral da equação de renderização. Uma década depois, Lafortune sugeriu muitos refinamentos, incluindo rastreamento de caminho bidirecional.

O transporte de luz em metrópole , um método de perturbar caminhos previamente encontrados para aumentar o desempenho em cenas difíceis, foi introduzido em 1997 por Eric Veach e Leonidas J. Guibas .

Mais recentemente, CPUs e GPUs se tornaram poderosas o suficiente para renderizar imagens mais rapidamente, causando um interesse mais amplo em algoritmos de rastreamento de caminho. Tim Purcell apresentou pela primeira vez um algoritmo de iluminação global rodando em uma GPU em 2002. Em fevereiro de 2009, Austin Robison da Nvidia demonstrou a primeira implementação comercial de um rastreador de caminho rodando em uma GPU, e outras implementações se seguiram, como a de Vladimir Koylazov em Agosto de 2009. Isso foi auxiliado pelo amadurecimento de kits de ferramentas de programação de GPGPU , como CUDA e OpenCL, e SDKs de rastreamento de raios de GPU, como OptiX .

O rastreamento de caminhos desempenhou um papel importante na indústria cinematográfica. Os filmes anteriores dependiam de renderizadores de linha de varredura para produzir efeitos visuais e animação CG. Em 1998, a Blue Sky Studios rendeu o curta-metragem vencedor do Oscar Bunny com seu renderizador de rastreamento de caminho CGI Studio, com sombras suaves e efeitos de iluminação indireta. Monster House , da Sony Pictures Imageworks , foi, em 2006, o primeiro longa-metragem de animação renderizado inteiramente em um path tracer, usando o renderizador comercial Arnold . Além disso, o Walt Disney Animation Studios tem usado seu próprio rastreador de caminho otimizado, conhecido como Hyperion, desde a produção de Big Hero 6 em 2014. Pixar Animation Studios também adotou o rastreamento de caminho para seu renderizador comercial RenderMan .

Descrição

A equação de renderização de Kajiya segue três princípios ópticos particulares; o Princípio da iluminação global, o Princípio da Equivalência (a luz refletida é equivalente à luz emitida) e o Princípio da Direção (a luz refletida e a luz espalhada têm uma direção).

No mundo real, objetos e superfícies são visíveis devido ao fato de estarem refletindo luz. Essa luz refletida então ilumina outros objetos por sua vez. A partir dessa observação simples, seguem dois princípios.

I. Para uma determinada cena interna, cada objeto na sala deve contribuir com iluminação para todos os outros objetos.

II. Em segundo lugar, não há distinção a ser feita entre a iluminação emitida por uma fonte de luz e a iluminação refletida de uma superfície.

Inventado em 1984, um método bastante diferente chamado radiosidade era fiel a ambos os princípios. No entanto, a radiosidade relaciona a iluminância total que cai sobre uma superfície com uma luminância uniforme que sai da superfície. Isso forçou todas as superfícies a serem lambertianas , ou "perfeitamente difusas". Embora a radiosidade tenha recebido muita atenção em sua invocação, superfícies perfeitamente difusas não existem no mundo real. A percepção de que o espalhamento de uma superfície depende das direções de entrada e saída é o princípio chave por trás da função de distribuição de refletância bidirecional (BRDF). Essa dependência da direção foi um foco de pesquisa que resultou na publicação de ideias importantes ao longo da década de 1990, uma vez que a contabilização da direção sempre cobrava um preço de aumentos acentuados nos tempos de cálculo em computadores desktop. Segue-se o Princípio III.

III. A iluminação proveniente de superfícies deve se espalhar em uma direção particular que é alguma função da direção de entrada da iluminação de chegada e da direção de saída sendo amostrada.

A equação de Kajiya é um resumo completo desses três princípios, e o rastreamento do caminho, que se aproxima de uma solução para a equação, permanece fiel a eles em sua implementação. Existem outros princípios óticos que não são o foco da equação de Kajiya e, portanto, são frequentemente difíceis ou incorretamente simulados pelo algoritmo. O rastreamento do caminho é confundido por fenômenos ópticos não contidos nos três princípios. Por exemplo,

Algoritmo

O pseudocódigo a seguir é um procedimento para executar rastreamento de caminho ingênuo. A função TracePath calcula uma única amostra de um pixel, onde apenas o caminho de coleta é considerado.

  Color TracePath(Ray ray, count depth) {
    if (depth >= MaxDepth) {
      return Black;  // Bounced enough times.
    }

    ray.FindNearestObject();
    if (ray.hitSomething == false) {
      return Black;  // Nothing was hit.
    }

    Material material = ray.thingHit->material;
    Color emittance = material.emittance;

    // Pick a random direction from here and keep going.
    Ray newRay;
    newRay.origin = ray.pointWhereObjWasHit;

    // This is NOT a cosine-weighted distribution!
    newRay.direction = RandomUnitVectorInHemisphereOf(ray.normalWhereObjWasHit);

    // Probability of the newRay
    const float p = 1 / (2 * PI);

    // Compute the BRDF for this ray (assuming Lambertian reflection)
    float cos_theta = DotProduct(newRay.direction, ray.normalWhereObjWasHit);
    Color BRDF = material.reflectance / PI;

    // Recursively trace reflected light sources.
    Color incoming = TracePath(newRay, depth + 1);

    // Apply the Rendering Equation here.
    return emittance + (BRDF * incoming * cos_theta / p);
  }

  void Render(Image finalImage, count numSamples) {
    foreach (pixel in finalImage) {
      foreach (i in numSamples) {
        Ray r = camera.generateRay(pixel);
        pixel.color += TracePath(r, 0);
      }
      pixel.color /= numSamples;  // Average samples.
    }
  }

Todas as amostras são então calculadas para obter a cor de saída. Observe que este método de sempre amostrar um raio aleatório no hemisfério normal só funciona bem para superfícies perfeitamente difusas. Para outros materiais, geralmente é necessário usar a amostragem por importância, ou seja, selecionar probabilisticamente um novo raio de acordo com a distribuição do BRDF. Por exemplo, um material perfeitamente especular (espelho) não funcionaria com o método acima, pois a probabilidade do novo raio ser o raio refletido correto - que é o único raio através do qual qualquer radiação será refletida - é zero. Nessas situações, deve-se dividir a refletância pela função de densidade de probabilidade do esquema de amostragem, de acordo com a integração de Monte-Carlo (no caso ingênuo acima, não há esquema de amostragem particular, então o PDF acaba sendo 1).

Existem outras considerações a serem levadas em consideração para garantir a conservação de energia. Em particular, no caso ingênuo, a refletância de um BRDF difuso não deve exceder ou o objeto refletirá mais luz do que recebe (isso, entretanto, depende do esquema de amostragem usado e pode ser difícil de acertar).

Rastreamento de caminho bidirecional

A amostragem da integral pode ser feita por uma das duas abordagens distintas a seguir:

  • Backwards Path Tracing , onde os caminhos são gerados a partir da câmera e saltando ao redor da cena até encontrar uma fonte de luz. Isso é conhecido como "para trás" porque os caminhos iniciais da câmera e o movimento em direção à fonte de luz são opostos à direção em que a luz está realmente viajando. Ele ainda produz o mesmo resultado porque todos os sistemas ópticos são reversíveis.
  • Light Tracing (ou Forwards Path Tracing ), onde os caminhos são gerados a partir das fontes de luz e saltando ao redor da cena até encontrar a câmera.

Em ambos os casos, uma técnica chamada Estimativa do próximo evento pode ser usada para reduzir a variância. Isso funciona através da amostragem direta de uma característica importante (a câmera no caso do Light Tracing , ou uma fonte de luz no caso do Backwards Path Tracing ) em vez de esperar que um caminho o atinja por acaso. Essa técnica geralmente é eficaz, mas se torna menos útil quando BRDFs especulares ou quase especulares estão presentes. Para Backwards Path Tracing , isso cria alta variação para caminhos cáusticos que interagem com uma superfície difusa e, em seguida, refletem em uma superfície especular antes de atingir uma fonte de luz. A estimativa do próximo evento não pode ser usada para amostrar esses caminhos diretamente da superfície difusa, porque a interação especular está no meio. Da mesma forma, não pode ser usado para amostrar caminhos da superfície especular porque há apenas uma direção em que a luz pode refletir. O Light Tracing tem um problema semelhante quando os caminhos interagem com uma superfície especular antes de atingir a câmera. Como essa situação é significativamente mais comum e objetos de vidro barulhentos (ou completamente pretos) são muito perturbadores visualmente, o Rastreamento de Caminho para Trás é o único método usado para Rastreamento de Caminho Unidirecional na prática.

O Rastreamento de Caminho Bidirecional fornece um algoritmo que combina as duas abordagens e pode produzir menor variação do que qualquer método sozinho. Para cada amostra, dois caminhos são traçados de forma independente: um usando da fonte de luz e outro da câmera. Isso produz um conjunto de estratégias de amostragem possíveis, onde cada vértice de um caminho pode ser conectado diretamente a cada vértice do outro. Os algoritmos originais Light Tracing e Backwards Path Tracing são casos especiais dessas estratégias. Para o Light Tracing , ele conecta os vértices do caminho da câmera diretamente ao primeiro vértice do caminho da luz. Para Backwards Path Tracing , ele conecta os vértices do caminho da luz ao primeiro vértice do caminho da câmera. Além disso, existem várias estratégias de amostragem completamente novas, onde vértices intermediários são conectados. Ponderar todas essas estratégias de amostragem usando a Amostragem de Importância Múltipla cria um novo amostrador que pode convergir mais rápido do que o Rastreamento de Caminho Unidirecional, embora mais trabalho seja necessário para cada amostra. Isso funciona particularmente bem para cáusticos ou cenas iluminadas principalmente por iluminação indireta.

atuação

O ruído diminui à medida que o número de amostras por pixel aumenta. O canto superior esquerdo mostra 1 amostra por pixel e dobra da esquerda para a direita cada quadrado.

Um rastreador de caminho faz a amostragem contínua de pixels de uma imagem . A imagem começa a se tornar reconhecível depois de apenas algumas amostras por pixel, talvez 100. No entanto, para a imagem "convergir" e reduzir o ruído a níveis aceitáveis, geralmente são necessárias cerca de 5000 amostras para a maioria das imagens, e muito mais para casos patológicos . O ruído é particularmente um problema para animações, dando-lhes uma qualidade de "grão de filme" normalmente indesejada de manchas aleatórias.

O gargalo central de desempenho no rastreamento de caminho é o cálculo geométrico complexo de lançar um raio. Amostragem de importância é uma técnica que é motivada para lançar menos raios através da cena enquanto ainda converge corretamente para a luminância de saída no ponto da superfície. Isso é feito lançando mais raios em direções nas quais a luminância teria sido maior de qualquer maneira. Se a densidade dos raios lançados em certas direções corresponder à força das contribuições nessas direções, o resultado é idêntico, mas muito menos raios foram realmente lançados. A Amostragem de Importância é usada para combinar a densidade do raio com a Lei Coseno de Lambert e também para combinar BRDFs.

O transporte de luz em metrópole pode resultar em uma imagem de baixo ruído com menos amostras. Este algoritmo foi criado para obter convergência mais rápida em cenas em que a luz deve passar por corredores ímpares ou pequenos orifícios para chegar à parte da cena que a câmera está visualizando. Também se mostrou promissor em interpretar corretamente as situações patológicas com cáusticos. Em vez de gerar caminhos aleatórios, novos caminhos de amostragem são criados como pequenas mutações dos existentes. Nesse sentido, o algoritmo "lembra" os caminhos bem-sucedidos das fontes de luz até a câmera.

Funções de distribuição de dispersão

Funções de distribuição de dispersão

As propriedades reflexivas (quantidade, direção e cor) das superfícies são modeladas usando BRDFs . O equivalente para luz transmitida (luz que atravessa o objeto) são BSDFs . Um rastreador de caminho pode aproveitar ao máximo as funções de distribuição complexas, cuidadosamente modeladas ou medidas, que controlam a aparência ("material", "textura" ou "sombreamento" em termos de computação gráfica) de um objeto.

Veja também

Notas

  1. ^ Kajiya, JT (1986). "A equação de renderização". Anais da 13ª conferência anual sobre computação gráfica e técnicas interativas . ACM. CiteSeerX  10.1.1.63.1402 .
  2. ^ Lafortune, E,Modelos Matemáticos e Algoritmos de Monte Carlo para Renderização Fisicamente Baseada, (tese de doutorado), 1996.
  3. ^ Purcell, TJ; Buck, eu; Mark, W; e Hanrahan, P, "Ray Tracing on Programmable Graphics Hardware",Proc. SIGGRAPH 2002, 703 - 712. Ver também Purcell, T,Ray tracing on a stream processor(PhD thesis), 2004.
  4. ^ Robison, Austin,"Interactive Ray Tracing on the GPU and NVIRT Overview", slide 37, I3D 2009.
  5. ^ Demonstração de Vray; Outros exemplos incluem Octane Render, Arion e Luxrender.
  6. ^ Seymour, Mike. "Novo Renderizador de Produção da Disney 'Hyperion' - Sim, Disney!" . fxguide . Retirado em 16 de setembro de 2017 .
  7. ^ Veach, E., e Guibas,transporte leve deLJMetropolis. Em SIGGRAPH'97 (agosto de 1997), pp. 65-76.
  8. SmallPt é um rastreador de caminho educacional de Kevin Beason. Ele usa 99 linhas de C ++ (incluindo a descrição da cena). Esta página possui um bom conjunto de exemplos de ruído resultante desta técnica.