3 pontos por GN⁺ 2024-04-16 | 1 comentários | Compartilhar no WhatsApp
  • Ray tracing espectral é uma abordagem que, em vez de transportar apenas valores RGB, também lida com comprimento de onda e fase, gerando uma distribuição espectral de potência (SPD) para cada pixel
  • O ray tracing comum faz rastreamento reverso da câmera em direção à fonte de luz por razões de desempenho, simplificando os raios como partículas com um vetor RGB
  • O olho humano cria cores a partir da resposta de três tipos de cones sensíveis a comprimentos de onda curtos, médios e longos, e a mesma cor pode surgir de diferentes SPDs
  • Em cenas como dispersão ou interferência em filme fino, onde o comprimento de onda influencia o caminho da luz e a cor, a aproximação RGB sozinha pode não ser suficiente
  • Um ray tracer espectral sem dependências, feito em JavaScript e GLSL, é usado como ferramenta para criar cores e movimentos irreais em arte computacional que altera deliberadamente as leis da luz

Câmera criada em código e ray tracing

  • Na arte computacional, tanto a cena quanto a câmera são criadas em código, e o resultado da renderização é convertido em um array de valores RGB
  • O ray tracing faz os raios ricochetearem entre objetos virtuais, modelando o caminho da luz que passa entre a câmera simulada e a fonte luminosa
  • Por questões de desempenho, ele não rastreia exatamente o movimento real da luz e usa várias simplificações
    • Como a maioria dos raios emitidos pela fonte de luz não chega à câmera, o rastreamento não começa na fonte, mas segue em sentido inverso a partir do ponto de vista da câmera
    • Esse rastreamento reverso é fisicamente válido sob a suposição de simetria T, em que as leis de transporte da luz são simétricas em relação à direção do tempo
  • Uma simplificação ainda maior é tratar os raios não como ondas, mas como partículas com um vetor de cor RGB
    • Isso ignora a natureza ondulatória da luz, mas produz resultados fisicamente plausíveis em muitas cenas
    • Essa aproximação é possível porque o olho humano possui três tipos de células detectoras de cor sensíveis a comprimentos de onda curtos, médios e longos

O olho responde ao espectro, não ao RGB

  • A luz no mundo real normalmente não é composta por um único comprimento de onda, mas por uma distribuição espectral de potência (SPD) formada pela mistura de vários comprimentos de onda
  • Uma única cor percebida por humanos pode corresponder a inúmeras SPDs, fenômeno chamado de metamerism
    • Por exemplo, o amarelo pode ser visto como um único comprimento de onda por volta de 580nm
    • Em dispositivos que usam apenas RGB, como monitores de computador, o amarelo também é reproduzido pela combinação de luz vermelha e verde
  • Também existem cores não espectrais que não podem ser produzidas por um único comprimento de onda, como o magenta
    • O magenta não corresponde a uma única posição no espectro
    • Ele exige a combinação de comprimentos de onda baixos e altos, isto é, luz azul e vermelha
  • O processo de converter uma SPD em cor pode ser tratado matematicamente
    • Existe uma ligação quantitativa entre física, fisiologia e experiência subjetiva da cor
    • Essa ligação está descrita nos espaços de cor CIE 1931, criados em 1931
  • Para uma implementação direta, é possível consultar o capítulo sobre cor em Physically Based Rendering

Cenas em que o comprimento de onda muda o resultado

  • No ray tracing, nem sempre é necessário considerar o espectro completo ou o comprimento de onda de cada raio individual
  • Ainda assim, em algumas cenas, a natureza ondulatória da luz afeta diretamente o caminho percorrido e, como resultado, também altera a cor visível
  • Um exemplo representativo é a dispersão
    • O caminho da luz se curva de forma diferente dependendo do comprimento de onda
    • É o fenômeno em que um prisma separa a luz branca em suas frequências componentes
  • Outro exemplo é a interferência em filme fino (thin film interference)
    • Ela explica os padrões semelhantes a arco-íris vistos em bolhas de sabão
    • A luz refletida nas camadas superior e inferior da película de sabão produz interferência construtiva e destrutiva
    • Nesse processo, em vez de separar o espectro em comprimentos de onda únicos, certas contribuições espectrais são ampliadas ou reduzidas
    • Como resultado, cores não espectrais como ciano-esverdeado, teal, magenta e marrom são produzidas com frequência

O que o ray tracing espectral considera

  • Ray tracing espectral é o ray tracing que leva em conta a natureza ondulatória da luz
  • Em vez de calcular o mundo apenas com cores RGB, ele gera uma distribuição espectral de potência para cada pixel da cena
  • Ele usa conjuntamente o comprimento de onda e a fase dos raios para estimar melhor as cores em situações em que essa informação é importante
  • É especialmente útil em casos como dispersão ou interferência em filme fino, em que comprimento de onda e fase alteram a cor resultante

Uso em arte computacional

  • Em trabalhos recentes, tem sido usada uma abordagem que quebra deliberadamente as leis que regem o movimento da luz e cria, em código, câmeras de um universo um pouco diferente do real
  • Ao lidar com a riqueza de todo o espectro da luz, é possível alterar as regras de propagação da luz de formas irreais
  • Os trabalhos publicados foram gerados com um ray tracer espectral sem dependências em JavaScript e GLSL, escrito manualmente
  • Entre os exemplos de obras estão:
    • Light Doesn't Bend That Way #1, 2023
      • Gerado fazendo o ângulo de reflexão ser uma função do comprimento de onda
      • Esse processo parece produzir apenas cores espectrais
    • Untitled, 2023
      • É um trabalho em andamento para a série FULL_SPECTRUM, apresentado em Tóquio em 2023
    • Untitled, 2023
      • Disponível como Video 3
      • O processo de fazer a obra se mover dentro desse sistema recebe atenção especial
    • Untitled, 2024

1 comentários

 
GN⁺ 2024-04-16
Opiniões no Hacker News
  • Se você quiser criar algo por conta própria, o e-book gratuito Ray Tracing Gems II 1 aborda ray tracing em GPU em tempo real baseado em APIs modernas e aceleração por hardware, e também tem um capítulo sobre renderização espectral
    Em especial, o capítulo 42, “Efficient spectral rendering on the GPU for predictive rendering”, é o relevante

    1 https://www.realtimerendering.com/raytracinggems/rtg2/

    • Para uma introdução bem rápida, também recomendo Ray Tracing in One Weekend 1; se depois quiser se aprofundar, Physically Based Rendering [2] é uma boa opção

      1 https://raytracing.github.io/

      [2] https://pbrt.org/

    • Não tenho tempo para mexer diretamente com ray tracing, mas, ao folhear o começo do livro, achei a amostragem por alias (alias sampling) uma técnica muito elegante e boa
      Ela é útil em um contexto muito mais amplo do que gráficos, então fiquei pensando que teria sido bom conhecê-la antes

  • Há alguns exemplos de ray tracers espectrais
    Mitsuba é um renderizador open source para pesquisa, com muitos recursos interessantes, como renderização diferenciável https://www.mitsuba-renderer.org/
    Maxwell tem dois modos espectrais com níveis de precisão diferentes, e o método mais complexo é bastante usado em óptica https://maxwellrender.com/
    O Manuka da Wētā FX é um renderizador espectral e foi usado em vários longas-metragens https://dl.acm.org/doi/10.1145/3182161 e https://www.wetafx.co.nz/research-and-tech/technology/manuka

  • Na minha opinião, a renderização espectral é um bom exemplo de que o ray tracing em si não é o ponto final da renderização, mas algo mais próximo de um ponto de partida
    Às vezes vejo um clima de que o ray tracing em tempo real resolveu o problema da renderização, mas acho que isso está longe da realidade
    Pelo que sei, a maioria dos sistemas de renderização espectral não lida com interferência em filmes finos nem com outros efeitos baseados em ondas, então esse também é outro território a explorar
    A realidade tem uma quantidade surpreendente de detalhes

    • Quanto mais a renderização se aproximar dos princípios físicos subjacentes, mais os motores de jogos vão se tornar motores de simulação de mundo
      Vários componentes de engine que hoje costumam ser separados podem convergir para um ponto comum, reduzindo, por exemplo, a distinção entre a camada de física e a camada de renderização
      Fico curioso para saber se essa tendência já pode ser observada em alguma medida hoje
      Quando o poder computacional aumentar em várias ordens de grandeza, as abstrações atuais também parecerão formas criadas pelas limitações técnicas do passado, assim como vemos a tecnologia de ponta de 30 anos atrás

    • É como um fractal: quanto mais de perto olhamos, mais detalhes que influenciam o que vemos aparecem
      Estamos nos aproximando pouco a pouco de uma renderização 100% fisicamente correta, mas provavelmente nunca chegaremos a 100% e continuaremos adicionando pequenas frações

    • Além da ideia de que a realidade tem uma quantidade surpreendente de detalhes, há também a polarização da luz1, que poucos lugares implementam, mas que pode gerar efeitos bastante perceptíveis em certas cenas

  • Um excelente motor de ray tracing espectral é o LuxRender: https://luxcorerender.org/
    Porém, isso vale para versões antigas; o renderizador LuxCore atual não tem suporte espectral completo
    Além dos efeitos mencionados aqui, a renderização espectral tem outras vantagens
    Quando implementada por meio de light tracing, ela permite alterar posteriormente a cor, o espectro e a intensidade das fontes de luz, e em muitas cenas a iluminação indireta também fica muito mais precisa

  • Se quiser brincar com uma implementação de ray tracing, escrevê-la você mesmo é surpreendentemente fácil
    Há um bom livro gratuito (https://raytracing.github.io/books/RayTracingInOneWeekend.ht...) e, se você conhece um pouco de Unity, o tutorial baseado em GPU (https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...) também é bom
    A versão em Unity tem uma GUI que facilita pré-visualizar a cena e mover a câmera, então é mais conveniente de mexer
    Se você não quiser escrever do zero, há muitas implementações baseadas nesse tipo de material, mas certamente vale a pena tentar por conta própria
    Brincando com uma implementação básica, experimentei fazer os raios se moverem como partículas para curvar seus trajetos em direção aos objetos ou para longe deles, ou memorizar o último ângulo de reflexão para usá-lo na próxima colisão com um material
    A maioria dos resultados não ficou grande coisa, mas ganhei intuição sobre o que estava vendo, e mover a câmera um pouco também ajudou bastante
    É realmente divertido como um pequeno projeto de programação de hobby
    Basicamente, ao intersectar um objeto, você define um comprimento máximo pequeno para o raio, dispara vários raios a partir daquele ponto para os arredores e aplica a cada colisão algo parecido com uma equação de gravidade
    Claro que é lento e apenas aproximado, mas é fácil, e dá até para implementar algo como um objeto buraco negro que curva a luz dentro da cena

    • Quando escrevi meu primeiro ray tracer, não levou o fim de semana inteiro; foram umas quatro páginas de código C escritas em uma noite

      http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...

      Depois disso fiz ray tracers em Clojure e Lua, e um ray marcher em JavaScript; eles podem ser bem pequenos e simples
      Ontem à noite vi o Spongy, do mentor/TBC https://www.pouet.net/prod.php?which=53871, e é um ray tracer de animação fractal com neblina feito com 65 instruções de código de máquina; o executável MS-DOS tem 128 bytes
      Como imagens de ray tracing são tão impressionantes, é fácil se sentir intimidado achando que os algoritmos e estruturas de dados para produzi-las também devem ser muito difíceis, mas, se você já conhece vetores 3D, na prática é bastante simples
      Sinto que ray marching com SDF é mais simples do que um ray tracer tradicional no estilo Whitted, porque substitui a maior parte da matemática complexa para resolver interseções exatas com a geometria da cena por um algoritmo de aproximação sequencial muito simples
      Ray tracers extremamente pequenos, como o Spongy ou o bootsector raytracer de Oscar Toledo G. https://github.com/nanochess/RayTracer, muitas vezes são mais difíceis de entender do que implementações um pouco maiores
      Isso porque torná-los tão pequenos exige muitos truques, e esses truques são mais difíceis de entender do que código simples

  • Para ir até o fim, é preciso rastrear não só o comprimento de onda de cada raio, mas também a polarização e a fase
    Casos em que essas propriedades afetam de fato a percepção humana são raros, como filmes finos ou redes de difração, mas eles certamente existem

  • Dá para ver a beleza de matemática e física realmente funcionando
    Fico curioso se alguns ajustes feitos pela beleza também poderiam ser úteis em outros modos de visualização
    Também me lembrou de quando eu digitava código de um livro para fazer música polifônica no Apple II
    Ao executar, havia claramente algo errado, mas em vez de ruído áspero saiu um padrão de notas estranhamente bonito, e aquele erro acidental foi bem fascinante

  • Parece que poderíamos criar imagens com muito mais do que 3 canais, como imagens hiperespectrais
    Já investiguei isso para enfatizar o espectro ao ensinar melhor as cores às crianças
    Por exemplo, ao passar o mouse sobre um pixel na imagem1, ela mostra o espectro, reforçando a relação entre cor e espectro
    Mas imagens hiperespectrais são raras, e tradicionalmente as câmeras[2] eram caras
    Então que tal imagens hiperespectrais sintéticas?
    Um renderizador de navegador com resolução muito baixa talvez seja rápido o suficiente para brincar interativamente com iluminação e materiais
    Também parece possível implementar pontos de vista de pessoas com deficiência na visão de cores, humanos que “conseguem ver UV após remoção do cristalino por catarata”, mamíferos não primatas dicromatas (ratos/cães) e peixes-zebra tetracromatas

    1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
    [2] Câmera multiespectral barata que usa iluminação de banda estreita multiplexada no tempo: https://ubicomplab.cs.washington.edu/publications/hypercam/

    • Com rastreamento de luz, é possível implementar isso de forma eficiente
      O valor final da imagem é a transformação das contribuições de cada fonte de luz e, como conhecemos o espectro da fonte de luz, também podemos ter o espectro do pixel
      Mas, se houver dispersão significativa ou efeitos de filme fino, será preciso amostrar o comprimento de onda em cada caminho, então isso se torna uma abordagem mais aproximada
  • Eu estava pensando em implementar refração no meu ray tracer distribuído
    É uma abordagem probabilística, não paralela https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
    Acho que bastaria amostrar aleatoriamente a frequência, calcular essa cor e usá-la para ajustar a cor do raio
    Para compensar o fato de a cor de refração pura ficar com 1/3 do brilho, é preciso multiplicar o resultado por 3

    • Acho que o termo “ray tracing distribuído” era mais uma expressão de um momento intermediário na evolução do ray tracing de Whitted para o path tracing (traçado de caminhos) de hoje
      Pelo que me lembro, é um termo que veio de um dos artigos do Rob Cook na SIGGRAPH
      Como conceito mais geral e unificado, é melhor migrar para path tracing, e também fica mais fácil encontrar dicas e técnicas ao pesquisar ou investigar
      Ao combinar renderização espectral com refração, é correto amostrar a distribuição para escolher a frequência
      Em geral, isso pode ser complicado, então é melhor ir construindo em etapas
      O mesmo vale para reflexão, mas em ambos os casos fica a seu critério usar materiais dependentes da frequência
      Mesmo usando materiais simplificados, ainda há motivos para usar uma abordagem espectral