¡Bienvenido a Open Shading Language!
Open Shading Language (OSL) es un lenguaje pequeño pero rico para sombreado programable en renderizadores avanzados y otras aplicaciones, ideal para describir materiales, luces, desplazamientos y generación de patrones.
OSL fue desarrollado originalmente por Sony Pictures Imageworks para su uso en su renderizador interno utilizado para animación de largometrajes y efectos visuales, lanzado como código abierto para que pudiera ser utilizado por otros estudios de animación y efectos visuales y proveedores de software de renderizado. Ahora es el lenguaje de sombreado estándar de facto para efectos visuales y funciones animadas, utilizado en toda la industria en muchos renderizadores comerciales y de estudio. Debido a esto, el trabajo en OSL recibió un Premio de la Academia por Logros Técnicos en 2017.
OSL es robusto y ha sido probado en producción, y se ha utilizado en películas tan diversas como "The Amazing Spider-Man", "Hotel Transylvania", "Edge of Tomorrow", "Ant Man", "Finding Dory" y muchas más. La compatibilidad con OSL se encuentra en la mayoría de los principales renderizadores utilizados para trabajos de animación y efectos visuales de alta gama. Para obtener una lista completa de películas y productos, consulte la filmografía.
El código OSL se distribuye bajo la licencia "Nuevo/BSD de 3 cláusulas" y la documentación bajo la Licencia Internacional Creative Commons Attribution 4.0. En resumen, usted es libre de utilizar OSL en sus propias aplicaciones, ya sean gratuitas o comerciales, abiertas o propietarias, así como de modificar el código y la documentación de OSL como desee, siempre que conserve los avisos de derechos de autor originales como se describe en la licencia.
OSL tiene una sintaxis similar a C, así como a otros lenguajes de sombreado. Sin embargo, está diseñado específicamente para algoritmos de renderizado avanzados y tiene características como cierres de radiancia, BSDF y trazado de rayos diferido como conceptos de primera clase.
OSL tiene varias características únicas que no se encuentran en otros lenguajes de sombreado (ciertamente no en todas juntas). Aquí hay algunas cosas que encontrará que son diferentes en OSL en comparación con otros lenguajes:
Los sombreadores de superficie y volumen calculan cierres de radiancia, no colores finales.
Los sombreadores de superficie y volumen de OSL calculan una descripción simbólica explícita, llamada "cierre", de la forma en que una superficie o volumen dispersa la luz, en unidades de resplandor. Estos cierres de radiancia pueden evaluarse en direcciones particulares, tomar muestras para encontrar direcciones importantes o guardarse para una evaluación y reevaluación posteriores. Este nuevo enfoque es ideal para un renderizador físico que admita el trazado de rayos y la iluminación global.
Por el contrario, otros lenguajes de sombreado normalmente calculan sólo un color de superficie visible desde una dirección particular. Estos sombreadores antiguos son "cajas negras" con las que un renderizador poco puede hacer excepto ejecutar para encontrar esta información (por ejemplo, no existe una manera efectiva de descubrir a partir de ellas qué direcciones es importante muestrear). Además, las unidades físicas de luces y superficies a menudo no están especificadas lo suficiente, lo que hace muy difícil garantizar que los sombreadores se comporten de manera físicamente correcta.
Los sombreadores de superficie y volumen no giran sobre las luces ni disparan rayos.
No hay "bucles de luz" ni rayos de iluminación trazados explícitamente en los sombreadores de superficie OSL. En cambio, los sombreadores de superficie calculan un cierre de radiancia que describe cómo la superficie dispersa la luz, y una parte del renderizador llamado "integrador" evalúa los cierres para un conjunto particular de fuentes de luz y determina en qué direcciones se deben trazar los rayos. Los efectos que normalmente requerirían un trazado de rayos explícito, como la reflexión y la refracción, son simplemente parte del cierre de radiancia y se parecen a cualquier otro BSDF.
Las ventajas de este enfoque incluyen que la integración y el muestreo pueden realizarse por lotes o reordenarse para aumentar la coherencia de los rayos; se puede asignar un "presupuesto de rayos" para muestrear de manera óptima el BSDF; los cierres podrán usarse para trazado de rayos bidireccional o transporte ligero Metropolis; y los cierres se pueden reevaluar rápidamente con nueva iluminación sin tener que volver a ejecutar los sombreadores.
Los sombreadores de superficie y de luz son lo mismo.
OSL no tiene un tipo de sombreador separado para fuentes de luz. Las luces son simplemente superficies emisoras y todas las luces son luces de área.
La transparencia es sólo otro tipo de iluminación.
No es necesario establecer explícitamente variables de transparencia/opacidad en el sombreador. La transparencia es simplemente otra forma en que la luz interactúa con una superficie y se incluye en el cierre de radiancia principal calculado por un sombreador de superficie.
Las salidas del renderizador (AOV) se pueden especificar usando "expresiones de ruta de luz".
A veces es deseable generar imágenes que contengan componentes de iluminación individuales como especulares, difusas, reflexivas, luces individuales, etc. En otros lenguajes, esto generalmente se logra agregando una gran cantidad de "variables de salida" a los sombreadores que recopilan estas cantidades individuales.
Los sombreadores OSL no necesitan estar saturados con ningún código o variables de salida para lograr esto. En cambio, existe una notación basada en expresiones regulares para describir qué caminos de luz deberían contribuir a qué salidas. Todo esto se hace en el lado del renderizador (aunque es compatible con la implementación de OSL). Si desea una nueva salida, no es necesario modificar los sombreadores en absoluto; sólo necesitas decirle al renderizador la nueva expresión de la ruta de luz.
Los sombreadores están organizados en redes.
Los sombreadores OSL no son monolíticos, sino que pueden organizarse en redes de sombreadores (a veces llamados grupo de sombreadores, gráfico o DAG), con salidas con nombre de algunos nodos conectadas a entradas con nombre de otros nodos dentro de la red. Estas conexiones se pueden realizar dinámicamente en el momento del renderizado y no afectan la compilación de nodos de sombreado individuales. Además, los nodos individuales se evalúan de forma perezosa, sólo cuando sus salidas se "extraen" de los nodos posteriores que dependen de ellos (los escritores de sombreadores pueden permanecer felizmente inconscientes de estos detalles y escribir sombreadores como si todo se evaluara normalmente).
Derivadas arbitrarias sin cuadrículas ni puntos de sombreado adicionales.
En OSL, puede tomar derivadas de cualquier cantidad calculada en un sombreador y usar cantidades arbitrarias como coordenadas de textura y esperar un filtrado correcto. Esto no requiere que los puntos sombreados estén dispuestos en una cuadrícula rectangular, ni que tengan ninguna conectividad particular, ni que ningún "punto adicional" esté sombreado. Esto se debe a que las derivadas no se calculan mediante diferencias finitas con puntos vecinos, sino mediante una "diferenciación automática", calculando diferenciales parciales para las variables que conducen a las derivadas, sin ninguna intervención requerida por el escritor del sombreador.
OSL se optimiza agresivamente en el momento del renderizado
OSL utiliza el marco del compilador LLVM para traducir redes de sombreadores a código de máquina sobre la marcha (justo a tiempo o "JIT") y, en el proceso, optimiza en gran medida los sombreadores y las redes con pleno conocimiento de los parámetros del sombreador y otros valores de tiempo de ejecución que no podrían. Se sabe cuándo se compilaron los sombreadores a partir del código fuente. Como resultado, estamos viendo que nuestras redes de sombreado OSL se ejecutan un 25 % más rápido que los sombreadores equivalentes creados a mano en C. (Así es como funcionaban nuestros antiguos sombreadores en nuestro renderizador).
La distribución de código abierto OSL consta de los siguientes componentes:
oslc, un compilador independiente que traduce el código fuente OSL en un código intermedio similar a un ensamblador (en forma de archivos .oso).
liboslc, una biblioteca que implementa la clase OSLCompiler, que contiene las entrañas del compilador de sombreadores, en caso de que alguien necesite incrustarlo en otras aplicaciones y no desee que el compilador sea un ejecutable independiente.
liboslquery, una biblioteca que implementa la clase OSLQuery, que permite a las aplicaciones consultar información sobre sombreadores compilados, incluida una lista completa de sus parámetros, sus tipos y cualquier metadato asociado con ellos.
oslinfo, un programa de línea de comandos que utiliza liboslquery para imprimir en la consola toda la información relevante sobre un sombreador y sus parámetros.
liboslexec, una biblioteca que implementa la clase ShadingSystem, que permite ejecutar sombreadores compilados dentro de una aplicación. Actualmente, utiliza LLVM para compilar JIT el código de bytes del sombreador en instrucciones x86.
testshade, un programa que le permite ejecutar un sombreador (o una red de sombreadores conectados) en una matriz rectangular de puntos y guardar cualquiera de sus salidas como imágenes. Esto permite la verificación de sombreadores (y el sistema de sombreado) sin necesidad de integrarlo en un renderizador completamente funcional, y es la base para la mayor parte de nuestra verificación del conjunto de pruebas. Junto con testrender, testsshade es un buen ejemplo de cómo llamar a las bibliotecas OSL.
testrender, un pequeño renderizador de trazado de rayos que utiliza OSL para sombrear. Las características son mínimas (sólo se permiten esferas en este momento) y no se ha prestado atención al rendimiento, pero demuestra cómo las bibliotecas OSL pueden integrarse en un renderizador funcional, qué interfaces necesita proporcionar el renderizador y cómo funcionan los BSDF/ los cierres de radiancia deben evaluarse e integrarse (incluido el muestreo de importancia múltiple).
Algunos sombreadores de muestra.
Documentación: en este momento consta de la especificación del lenguaje OSL (útil para escritores de sombreadores), pero en el futuro tendrá documentación detallada sobre cómo integrar las bibliotecas OSL en los renderizadores.
Esta lista solo contiene películas o productos cuyo uso de OSL se indica o se puede inferir de fuentes públicas, o que nos han dicho que podemos enumerar aquí. Si falta un proyecto que utiliza OSL y no es un secreto, simplemente envíe un correo electrónico al líder del proyecto OSL o envíe un PR con las ediciones de este archivo.
(En orden aproximado de adición de soporte OSL)
(Aquí consideramos que "trabajo significativo" significa un largometraje estrenado en cines o en una importante plataforma de transmisión, series de televisión/transmisión que presentan muchos efectos visuales o animación, o cortometrajes que han ganado o han sido nominados a premios importantes).
Lea el archivo INSTALL.md para obtener instrucciones detalladas sobre cómo compilar e instalar OSL.
La especificación del lenguaje OSL se puede encontrar en src/doc/osl-languagespec.pdf (en una distribución fuente) o en el archivo share/doc/OSL/osl-languagespec.pdf de una distribución binaria instalada.
Documentación OSL experimental en ReadTheDocs Esta será la documentación futura. Probablemente sea tan completo como el PDF, pero necesita algunas correcciones, por lo que el PDF todavía se considera la fuente autorizada por ahora. Pero pronto, la antigua especificación PDF quedará obsoleta en favor de esta documentación en línea.
También hay una versión en PDF.
Para aquellos interesados en aprender a programar sombreadores en OSL, existe el curso Siggraph 2022 Educator's Forum OSL Shaders para RenderMan, que utiliza RenderMan en los ejemplos y materiales complementarios, pero que trata principalmente sobre la escritura de sombreadores en OSL.
Las preguntas simples de "¿cómo puedo...", "Tengo problemas" o "¿es esto un error?" se formulan mejor en la lista de correo de desarrolladores de osl-dev. Ahí es donde la mayoría de la gente lo verá y potencialmente podrá responder su pregunta rápidamente (más que un "problema" de GH).
Los errores, los problemas de compilación y las vulnerabilidades descubiertas que usted está relativamente seguro de que son un problema legítimo en el código y para las cuales puede dar instrucciones claras sobre cómo reproducirlas deben informarse como problemas.
Si cree que ha encontrado una vulnerabilidad potencial en OSL, infórmelo de forma confidencial enviando un correo electrónico a los administradores del proyecto a [email protected].
Si cualquier otro asunto requiere confidencialidad que impida una pregunta o problema público, puede comunicarse con el administrador del proyecto de manera privada en [email protected].
OSL agradece las contribuciones de código y casi 50 personas lo han hecho a lo largo de los años. Recibimos contribuciones de código a través del mecanismo habitual de solicitud de extracción (PR) de GitHub. Consulte CONTRIBUCIÓN para obtener instrucciones detalladas.
Página de OSL en GitHub
Lea o suscríbase a la lista de correo de desarrollo de OSL
PDF más reciente de la especificación del lenguaje OSL
página de inicio de OSL
El liderazgo actual del proyecto está documentado en el archivo de Gobernanza.
Muchas personas han contribuido con funciones, correcciones de errores y otros cambios a OSL a lo largo de los años: 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. (Enumerados alfabéticamente; si hemos omitido a alguien, es sin querer, háganoslo saber).
No podemos expresar suficiente gratitud a los gerentes de Sony Pictures Imageworks que permitieron que este proyecto continuara, lo apoyaron incondicionalmente y nos permitieron revelar la fuente, especialmente a Rob Bredow, Brian Keeney, Barbara Ford, Rene Limberger, Erik Strauss y Mike. Vado.
Muchas gracias también al equipo de sombreado de crack de SPI, y a los valientes TD de desarrollo de apariencia y supers CG dispuestos a utilizar OSL en sus programas. Fueron nuestros conejillos de indias, inspiración, evaluadores y una fantástica fuente de comentarios. Y, por supuesto, los muchos ingenieros, TD y artistas de otros lugares que incorporaron OSL en sus productos y procesos, especialmente los primeros que tomaron riesgos en Chaos Group, Double Negative, Pixar, DNA, Isotropix y Animal Logic. Gracias y esperamos haber respondido a sus necesidades.
OSL no se desarrolló de forma aislada. Tenemos una deuda con las personas y los estudios que leyeron pacientemente los primeros borradores de la especificación del lenguaje y nos brindaron comentarios muy útiles e ideas adicionales, así como con las continuas contribuciones y comentarios de sus desarrolladores y usuarios actuales en otros estudios de animación y efectos visuales.
La implementación de OSL depende de varios otros paquetes de código abierto, todos con licencias compatibles:
La documentación de OSL incorpora partes de Markdeep (c) 2015-2016, Morgan McGuire, y Highlight.js (c) 2006, Ivan Sagalaev, ambos distribuidos bajo licencias BSD.