Bem-vindo ao Open Shading Language!
Open Shading Language (OSL) é uma linguagem pequena, mas rica, para sombreamento programável em renderizadores avançados e outras aplicações, ideal para descrever materiais, luzes, deslocamento e geração de padrões.
OSL foi originalmente desenvolvido pela Sony Pictures Imageworks para uso em seu renderizador interno usado para animação de longas-metragens e efeitos visuais, lançado como código aberto para que pudesse ser usado por outros estúdios de efeitos visuais e animação e fornecedores de software de renderização. Agora é a linguagem de sombreamento padrão de fato para efeitos visuais e recursos animados, usada em todo o setor em muitos renderizadores comerciais e proprietários de estúdio. Por causa disso, o trabalho em OSL recebeu o Oscar de Realização Técnica em 2017.
OSL é robusto e comprovado em produção, e tem sido usado em filmes tão diversos como “O Espetacular Homem-Aranha”, “Hotel Transilvânia”, “No Limite do Amanhã”, “Homem Formiga”, “Procurando Dory” e muitos mais. O suporte OSL está na maioria dos renderizadores líderes usados para trabalhos de animação e efeitos visuais de ponta. Para uma lista completa de filmes e produtos, consulte a filmografia.
O código OSL é distribuído sob a licença "New/3-clause BSD" e a documentação sob a licença Creative Commons Attribution 4.0 International. Resumindo, você é livre para usar o OSL em seus próprios aplicativos, sejam eles gratuitos ou comerciais, abertos ou proprietários, bem como modificar o código e a documentação do OSL conforme desejar, desde que retenha os avisos de direitos autorais originais, conforme descrito em a licença.
OSL tem sintaxe semelhante a C, assim como outras linguagens de sombreamento. No entanto, ele foi projetado especificamente para algoritmos de renderização avançados e possui recursos como fechamentos de brilho, BSDFs e rastreamento de raio diferido como conceitos de primeira classe.
OSL possui diversas características únicas não encontradas em outras linguagens de sombreamento (certamente nem todas juntas). Aqui estão algumas coisas que você descobrirá que são diferentes no OSL em comparação com outras linguagens:
Os shaders de superfície e volume calculam fechamentos de brilho, não cores finais.
Os sombreadores de superfície e volume do OSL calculam uma descrição simbólica explícita, chamada de "fechamento", da forma como uma superfície ou volume dispersa a luz, em unidades de brilho. Esses fechamentos de radiância podem ser avaliados em direções específicas, amostrados para encontrar direções importantes ou salvos para avaliação e reavaliação posteriores. Esta nova abordagem é ideal para um renderizador baseado em física que suporta ray tracing e iluminação global.
Em contraste, outras linguagens de sombreamento geralmente calculam apenas uma cor de superfície visível de uma direção específica. Esses shaders antigos são "caixas pretas" com as quais um renderizador pouco pode fazer, mas executar para encontrar essa informação (por exemplo, não há uma maneira eficaz de descobrir a partir deles quais direções são importantes para amostrar). Além disso, as unidades físicas de luzes e superfícies são frequentemente subespecificadas, tornando muito difícil garantir que os shaders estejam se comportando fisicamente de maneira correta.
Os sombreadores de superfície e volume não passam pelas luzes nem emitem raios.
Não há "loops de luz" ou raios de iluminação explicitamente traçados nos sombreadores de superfície OSL. Em vez disso, os sombreadores de superfície calculam um fechamento de brilho que descreve como a superfície espalha a luz, e uma parte do renderizador chamada "integrador" avalia os fechamentos para um conjunto específico de fontes de luz e determina em quais direções os raios devem ser rastreados. Os efeitos que normalmente exigiriam traçado de raio explícito, como reflexão e refração, são simplesmente parte do fechamento de radiância e se parecem com qualquer outro BSDF.
As vantagens desta abordagem incluem que a integração e a amostragem podem ser agrupadas ou reordenadas para aumentar a coerência dos raios; um "orçamento de raios" pode ser alocado para amostrar de maneira ideal o BSDF; os fechamentos podem ser usados para traçado de raio bidirecional ou transporte leve Metropolis; e os fechamentos podem ser rapidamente reavaliados com nova iluminação sem a necessidade de reexecutar os shaders.
Shaders de superfície e de luz são a mesma coisa.
OSL não possui um tipo separado de shader para fontes de luz. As luzes são simplesmente superfícies emissivas e todas as luzes são luzes de área.
A transparência é apenas outro tipo de iluminação.
Você não precisa definir explicitamente variáveis de transparência/opacidade no sombreador. A transparência é apenas outra maneira da luz interagir com uma superfície e está incluída no fechamento de radiância principal calculado por um sombreador de superfície.
As saídas do renderizador (AOVs) podem ser especificadas usando "expressões de caminho óptico".
Às vezes é desejável gerar imagens contendo componentes de iluminação individuais, como especular, difusa, reflexão, luzes individuais, etc. Em outras linguagens, isso geralmente é feito adicionando uma infinidade de "variáveis de saída" aos shaders que coletam essas quantidades individuais.
Os shaders OSL não precisam estar sobrecarregados com nenhum código ou variáveis de saída para conseguir isso. Em vez disso, existe uma notação baseada em expressões regulares para descrever quais caminhos ópticos devem contribuir para quais resultados. Tudo isso é feito no lado do renderizador (embora seja suportado pela implementação OSL). Se você deseja uma nova saída, não há necessidade de modificar os shaders; você só precisa informar ao renderizador a nova expressão do caminho óptico.
Os shaders são organizados em redes.
Os shaders OSL não são monolíticos, mas podem ser organizados em redes de shaders (às vezes chamados de grupo de shaders, gráfico ou DAG), com saídas nomeadas de alguns nós sendo conectadas a entradas nomeadas de outros nós dentro da rede. Essas conexões podem ser feitas dinamicamente no momento da renderização e não afetam a compilação de nós de sombreamento individuais. Além disso, os nós individuais são avaliados preguiçosamente, apenas quando suas saídas são "extraídas" dos nós posteriores que dependem deles (os criadores de shaders podem permanecer alegremente inconscientes desses detalhes e escrever shaders como se tudo fosse avaliado normalmente).
Derivadas arbitrárias sem grades ou pontos extras de sombreamento.
No OSL, você pode derivar de qualquer quantidade computada em um shader e usar quantidades arbitrárias como coordenadas de textura e esperar uma filtragem correta. Isto não exige que os pontos sombreados sejam organizados em uma grade retangular, ou que tenham qualquer conectividade específica, ou que quaisquer “pontos extras” sejam sombreados. Isso ocorre porque as derivadas não são calculadas por diferenças finitas com pontos vizinhos, mas sim por "diferenciação automática", computando diferenciais parciais para as variáveis que levam às derivadas, sem qualquer intervenção exigida pelo escritor do sombreador.
OSL otimiza agressivamente no tempo de renderização
OSL usa a estrutura do compilador LLVM para traduzir redes de shaders em código de máquina em tempo real (just in time, ou "JIT") e, no processo, otimiza fortemente shaders e redes com total conhecimento dos parâmetros de shader e outros valores de tempo de execução que não poderiam eram conhecidos quando os shaders foram compilados a partir do código-fonte. Como resultado, estamos vendo nossas redes de sombreamento OSL serem executadas 25% mais rápido do que os shaders equivalentes feitos à mão em C! (É assim que nossos antigos shaders funcionavam em nosso renderizador.)
A distribuição de código aberto OSL consiste nos seguintes componentes:
oslc, um compilador independente que traduz o código-fonte OSL em um código intermediário semelhante a assembly (na forma de arquivos .oso).
liboslc, uma biblioteca que implementa a classe OSLCompiler, que contém a essência do compilador de shader, caso alguém precise incorporá-lo em outros aplicativos e não deseje que o compilador seja um executável separado.
liboslquery, uma biblioteca que implementa a classe OSLQuery, que permite aos aplicativos consultar informações sobre shaders compilados, incluindo uma lista completa de seus parâmetros, seus tipos e quaisquer metadados associados a eles.
oslinfo, um programa de linha de comando que usa liboslquery para imprimir no console todas as informações relevantes sobre um shader e seus parâmetros.
liboslexec, uma biblioteca que implementa a classe ShadingSystem, que permite que shaders compilados sejam executados dentro de um aplicativo. Atualmente, ele usa LLVM para compilar JIT o bytecode do shader para instruções x86.
testshade, um programa que permite executar um shader (ou rede de shaders conectada) em uma matriz retangular de pontos e salvar qualquer uma de suas saídas como imagens. Isso permite a verificação de shaders (e do sistema de sombreamento) sem a necessidade de integração em um renderizador totalmente funcional e é a base para a maior parte de nossa verificação de suíte de testes. Junto com o testrender, o testshade é um bom exemplo de como chamar as bibliotecas OSL.
testrender, um pequeno renderizador de rastreamento de raio que usa OSL para sombreamento. Os recursos são mínimos (apenas esferas são permitidas no momento) e não houve atenção ao desempenho, mas demonstra como as bibliotecas OSL podem ser integradas em um renderizador funcional, quais interfaces o renderizador precisa fornecer e como os BSDFs/ os fechamentos de radiância devem ser avaliados e integrados (inclusive com amostragem de importância múltipla).
Alguns exemplos de shaders.
Documentação - neste ponto consiste na especificação da linguagem OSL (útil para criadores de shaders), mas no futuro terá documentação detalhada sobre como integrar as bibliotecas OSL nos renderizadores.
Esta lista contém apenas filmes ou produtos cujo uso da OSL é declarado ou pode ser inferido de fontes públicas, ou que nos disseram que podemos listar aqui. Se um projeto que usa OSL estiver faltando e não for segredo, basta enviar um e-mail ao líder do projeto OSL ou enviar um PR com edições neste arquivo.
(Na ordem aproximada de adição de suporte OSL)
(Aqui consideramos "trabalho significativo" como um longa-metragem lançado nos cinemas ou em uma grande plataforma de streaming, séries de TV/streaming com muitos efeitos visuais ou animação, ou curtas-metragens que ganharam ou foram indicados para prêmios importantes.)
Por favor, leia o arquivo INSTALL.md para obter instruções detalhadas sobre como construir e instalar o OSL.
A especificação da linguagem OSL pode ser encontrada em src/doc/osl-languagespec.pdf (em uma distribuição fonte) ou no arquivo share/doc/OSL/osl-languagespec.pdf de uma distribuição binária instalada.
Documentação Experimental OSL em ReadTheDocs Esta será a documentação futura. Provavelmente está tão completo quanto o PDF, mas precisa de alguma revisão, então o PDF ainda é considerado a fonte oficial por enquanto. Mas em breve, a antiga especificação PDF será descontinuada em favor desta documentação online.
Também existe uma versão em PDF.
Para aqueles interessados em aprender a programar shaders em OSL, existe o curso Siggraph 2022 Educator's Forum OSL Shaders for RenderMan, que usa RenderMan nos exemplos e materiais suplementares, mas que é principalmente sobre escrita de shaders em OSL.
Perguntas simples do tipo "como faço para...", "Estou tendo problemas" ou "isso é um bug" são melhor feitas na lista de e-mail do desenvolvedor osl-dev. É aí que a maioria das pessoas verá e poderá responder à sua pergunta rapidamente (mais do que um "problema" de GH).
Bugs, problemas de construção e vulnerabilidades descobertas que você tem relativamente certeza de serem problemas legítimos no código e para os quais você pode fornecer instruções claras sobre como reproduzir devem ser relatados como problemas.
Se você acha que encontrou uma vulnerabilidade potencial no OSL, informe-a confidencialmente enviando um e-mail aos administradores do projeto em [email protected].
Se qualquer outra questão exigir confidencialidade que impeça uma questão ou problema público, você poderá entrar em contato com o administrador do projeto em particular em [email protected].
A OSL aceita contribuições de código e quase 50 pessoas já fizeram isso ao longo dos anos. Recebemos contribuições de código por meio do mecanismo usual de pull request (PR) do GitHub. Consulte CONTRIBUINDO para obter instruções detalhadas.
Página GitHub do OSL
Leia ou assine a lista de discussão de desenvolvimento OSL
PDF mais recente da especificação da linguagem OSL
Página inicial do OSL
A atual liderança do projeto está documentada no arquivo de Governança.
Muitas pessoas contribuíram com recursos, correções de bugs e outras mudanças para OSL ao longo dos anos: Steve Agland, Shane Ambler, Martijn Berger, Farchad Bidgolirad, Nicholas Bishop, Curtis Black, Rasmus Bonnedal, Solomon Boulos, Stefan Bruens, Stefan Büttner, Matthaus G Chajdas, Clark Chen, Mehdi Chinoune, Alejandro Conty, Damien Courtois, Dieter De Baets, Thomas Dinges, Daniel Dresser, Mads Drøschler, Peter Ellerington, Luke Emrose, Louis Feng, Mark Final, Henri Fousse, Stephen Friedman, Syoyo Fujita, Tim. Grant, Larry Gritz, Nicolas Guiard, Euan Haahr, Derek Haase, Sven-Hendrik Haase, John Haddon, Niklas Harrysson, Daniel Heckenberg, Chris Hellmuth, Adrien Herubel, Dan Horák, Thiago Ize, Matt Johnson, Ronan Keryell, Chris Kulla, Elvic Liang, Max Liani, Adam Martinez, John Mertic, Bastien Montagne, Steena Monteiro, Patrick Mours, Alexis Oblet, Erich Ocean, Mikko Ohtamaa, Jino Park, Alexei Pawlow, Mitch Prater, Jay Reynolds, Declan Russell, Benoit Ruiz, Patrick Scheibe, Alex Schworer, Jonathan Scruggs, Sergey Sharybin, Mark Sisson, Sandip Shukla, Cliff Stein, Stephan Steinbach, Luya Tshimbalanga, Esteban Tovagliari, Brecht Van Lommel, Thibault Vergne, Alexander von Knorring, Aidan Welch, Alex Wells, Roman Zulak. (Listado em ordem alfabética; se deixamos alguém de fora, é inadvertido, por favor nos avise.)
Não podemos expressar gratidão suficiente aos gerentes da Sony Pictures Imageworks que permitiram que este projeto prosseguisse, apoiaram-no de todo o coração e nos permitiram divulgar a fonte, especialmente Rob Bredow, Brian Keeney, Barbara Ford, Rene Limberger, Erik Strauss e Mike Ford.
Enormes agradecimentos também vão para a equipe de crack shading da SPI e para os corajosos TDs de lookdev e superes de CG dispostos a usar OSL em seus programas. Eles serviram como cobaias, inspiração, testadores e uma fonte fantástica de feedback. E, claro, os muitos engenheiros, DTs e artistas de outros lugares que incorporaram OSL em seus produtos e pipelines, especialmente os primeiros que assumiram riscos no Chaos Group, Double Negative, Pixar, DNA, Isotropix e Animal Logic. Obrigado e esperamos ter respondido às suas necessidades.
OSL não foi desenvolvido isoladamente. Temos uma dívida com os indivíduos e estúdios que leram pacientemente os primeiros rascunhos das especificações da linguagem e nos deram feedback muito útil e ideias adicionais, bem como com as contribuições e feedback contínuos de seus atuais desenvolvedores e usuários de outros estúdios de efeitos visuais e de animação.
A implementação do OSL depende de vários outros pacotes de código aberto, todos com licenças compatíveis:
A documentação da OSL incorpora partes do Markdeep (c) 2015-2016, Morgan McGuire, e destaque.js (c) 2006, Ivan Sagalaev, ambos distribuídos sob licenças BSD.