欢迎使用开放着色语言!
开放着色语言 (OSL) 是一种小型但功能丰富的语言,用于高级渲染器和其他应用程序中的可编程着色,非常适合描述材质、灯光、位移和图案生成。
OSL 最初由 Sony Pictures Imageworks 开发,用于其用于故事片动画和视觉效果的内部渲染器,并作为开源发布,以便其他视觉效果和动画工作室以及渲染软件供应商使用。现在,它已成为视觉特效和动画功能事实上的标准着色语言,在整个行业的许多商业和工作室专有渲染器中使用。因此,OSL 的工作于 2017 年获得了奥斯卡技术成就奖。
OSL 功能强大且经过制作验证,已在《超凡蜘蛛侠》、《精灵旅社》、《明日边缘》、《蚁人》、《海底总动员:多莉》等多部电影中使用。用于高端视觉特效和动画工作的大多数领先渲染器都支持 OSL。有关电影和产品的完整列表,请参阅电影目录。
OSL 代码根据“New/3-clause BSD”许可证分发,文档根据 Creative Commons Attribution 4.0 International License 分发。简而言之,您可以在自己的应用程序中自由使用 OSL,无论它们是免费的还是商业的、开放的还是专有的,也可以根据需要修改 OSL 代码和文档,前提是您保留原始版权声明,如许可证。
OSL 的语法类似于 C 以及其他着色语言。然而,它是专门为高级渲染算法而设计的,并具有诸如辐射闭包、BSDF 和延迟光线追踪等一流概念的功能。
OSL 具有其他着色语言所没有的几个独特特征(当然不是全部都具备)。您会发现 OSL 与其他语言相比存在以下一些不同之处:
表面和体积着色器计算辐射闭合,而不是最终颜色。
OSL 的表面和体积着色器以辐射度为单位计算表面或体积散射光的方式的明确符号描述(称为“闭包”)。这些辐射闭包可以在特定方向上进行评估,采样以找到重要方向,或者保存以供以后评估和重新评估。这种新方法非常适合支持光线追踪和全局照明的基于物理的渲染器。
相比之下,其他着色语言通常仅计算从特定方向可见的表面颜色。这些旧的着色器是“黑匣子”,渲染器只能执行这些黑匣子来查找这一信息(例如,没有有效的方法从它们中发现哪些方向对于采样很重要)。此外,灯光和表面的物理单位通常未指定,因此很难确保着色器以物理正确的方式运行。
表面和体积着色器不会循环灯光或发射光线。
OSL 表面着色器中没有“光环”或明确追踪的照明光线。相反,表面着色器计算描述表面如何散射光的辐射闭包,渲染器中称为“积分器”的部分评估特定光源集的闭包,并确定应跟踪光线的方向。通常需要显式光线追踪的效果(例如反射和折射)只是辐射闭包的一部分,并且看起来与任何其他 BSDF 一样。
这种方法的优点包括积分和采样可以分批或重新排序以增加射线相干性;可以分配“光线预算”来对 BSDF 进行最佳采样;封闭物可用于双向光线追踪或 Metropolis 光传输;并且可以使用新的照明快速重新评估闭包,而无需重新运行着色器。
表面着色器和灯光着色器是同一件事。
OSL 没有单独的光源着色器。灯光只是发光的表面,所有灯光都是区域光。
透明度只是另一种照明。
您不需要在着色器中显式设置透明度/不透明度变量。透明度只是光与表面交互的另一种方式,并且包含在表面着色器计算的主辐射闭包中。
渲染器输出(AOV)可以使用“光路表达式”来指定。
有时需要输出包含单独照明组件(例如镜面反射、漫反射、反射、单独灯光等)的图像。在其他语言中,这通常是通过向收集这些单独量的着色器添加过多的“输出变量”来实现的。
OSL 着色器不需要混杂任何代码或输出变量来实现此目的。相反,有一个基于正则表达式的符号来描述哪些光路应该贡献哪些输出。这一切都是在渲染器端完成的(尽管由 OSL 实现支持)。如果您需要新的输出,则根本不需要修改着色器;你只需要告诉渲染器新的光路表达式。
着色器被组织成网络。
OSL 着色器不是整体式的,而是可以组织成着色器网络(有时称为着色器组、图形或 DAG),其中某些节点的命名输出连接到网络内其他节点的命名输入。这些连接可以在渲染时动态完成,并且不会影响各个着色器节点的编译。此外,只有当从依赖于它们的后续节点“拉出”它们的输出时,才会对各个节点进行惰性评估(着色器编写者可能仍然幸福地不知道这些细节,并编写着色器,就好像一切都正常评估一样)。
没有网格或额外着色点的任意导数。
在 OSL 中,您可以在着色器中获取任何计算量的导数,并使用任意量作为纹理坐标并期望正确的过滤。这不需要将阴影点排列在矩形网格中,或者具有任何特定的连接性,或者对任何“额外点”进行阴影处理。这是因为导数不是通过与相邻点的有限差计算的,而是通过“自动微分”计算的,计算导致导数的变量的偏微分,而无需着色器编写器进行任何干预。
OSL 在渲染时积极优化
OSL 使用 LLVM 编译器框架将着色器网络即时翻译为机器代码(即时或“JIT”),并在此过程中大力优化着色器和网络,充分了解着色器参数和其他运行时值,而这些值是无法实现的。当着色器从源代码编译时就已经知道了。因此,我们发现我们的 OSL 着色网络的执行速度比用 C 手工制作的同等着色器快 25%! (这就是我们的旧着色器在渲染器中的工作方式。)
OSL 开源发行版由以下组件组成:
oslc,一个独立的编译器,可将 OSL 源代码转换为类似汇编的中间代码(以 .oso 文件的形式)。
liboslc,一个实现 OSLCompiler 类的库,其中包含着色器编译器的内部结构,以防有人需要将其嵌入到其他应用程序中并且不希望编译器成为单独的可执行文件。
liboslquery,一个实现 OSLQuery 类的库,它允许应用程序查询有关已编译着色器的信息,包括其参数、类型以及与其关联的任何元数据的完整列表。
oslinfo,一个命令行程序,它使用 liboslquery 将有关着色器及其参数的所有相关信息打印到控制台。
liboslexec,一个实现 ShadingSystem 类的库,它允许在应用程序中执行编译的着色器。目前,它使用 LLVM 将着色器字节码 JIT 编译为 x86 指令。
testshade 是一个程序,可让您在点的矩形阵列上执行着色器(或连接的着色器网络),并将其任何输出保存为图像。这允许验证着色器(和着色系统),而无需集成到功能齐全的渲染器中,并且是我们大多数测试套件验证的基础。与 testrender 一起,testshade 是如何调用 OSL 库的一个很好的示例。
testrender,一个使用 OSL 进行着色的小型光线追踪渲染器。功能非常少(此时只允许球体)并且没有关注性能,但它演示了如何将 OSL 库集成到工作渲染器中、渲染器需要提供哪些接口以及 BSDF/应评估和整合辐射闭包(包括多重重要性采样)。
一些示例着色器。
文档——目前由 OSL 语言规范(对着色器编写者有用)组成,但将来将包含有关如何将 OSL 库集成到渲染器中的详细文档。
此列表仅包含已说明或可以从公共来源推断出 OSL 使用的电影或产品,或者我们被告知可以在此处列出的电影或产品。如果缺少使用 OSL 的项目并且该项目不是秘密,只需向 OSL 项目负责人发送电子邮件或提交对此文件进行编辑的 PR 即可。
(按照添加 OSL 支持的大致顺序)
(在这里,我们认为“重要作品”是指在院线或主要流媒体平台上发行的故事片、以视觉效果或动画为特色的电视/流媒体连续剧,或已赢得或被提名主要奖项的短片。)
请阅读 INSTALL.md 文件以获取有关如何构建和安装 OSL 的详细说明。
OSL 语言规范可以在 src/doc/osl-languagespec.pdf(在源发行版中)或已安装的二进制发行版的 share/doc/OSL/osl-languagespec.pdf 文件中找到。
ReadTheDocs 上的实验性 OSL 文档 这将是未来的文档。它可能与 PDF 一样完整,但需要一些校对,因此 PDF 目前仍被认为是权威来源。但很快,旧的 PDF 规范将被弃用,取而代之的是此在线文档。
还有一个 PDF 版本。
对于那些有兴趣学习在 OSL 中编写着色器的人,可以阅读 Siggraph 2022 教育者论坛 OSL Shaders for RenderMan 课程,该课程在示例和补充材料中使用 RenderMan,但主要是关于在 OSL 中编写着色器。
简单的“我该如何...”、“我遇到麻烦”或“这是一个错误”问题最好在 osl-dev 开发人员邮件列表上提出。这是大多数人会看到它的地方,并且可能能够快速回答您的问题(比 GH“问题”更重要)。
Bug、构建问题和发现的漏洞,您相对确定是代码中的合法问题,并且您可以给出有关如何重现的明确说明,应将其报告为问题。
如果您认为您发现了 OSL 中的潜在漏洞,请通过发送电子邮件至 [email protected] 来秘密报告该漏洞。
如果任何其他问题需要保密而无法公开提问或问题,您可以通过 [email protected] 私下联系项目管理员。
OSL 欢迎代码贡献,多年来已有近 50 人这样做。我们通过常用的 GitHub 拉取请求 (PR) 机制获取代码贡献。请参阅贡献以获取详细说明。
OSL GitHub 页面
阅读或订阅 OSL 开发邮件列表
OSL 语言规范的最新 PDF
OSL 主页
当前的项目领导记录在治理文件中。
多年来,许多人为 OSL 贡献了功能、错误修复和其他更改: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。格兰特、拉里·格里茨、尼古拉斯·吉亚德、尤安·哈尔、德里克·哈斯、斯文-亨德里克·哈斯、约翰·哈登、尼克拉斯·哈里森、丹尼尔·赫肯伯格、克里斯·赫尔姆斯、阿德里安·赫鲁贝尔、丹·霍拉克、蒂亚戈·伊泽、马特·约翰逊、罗南·克里尔、克里斯·库拉、埃尔维克梁, 马克斯·利亚尼, 亚当·马丁内斯, 约翰·默蒂克, 巴斯蒂安·蒙塔尼, 斯蒂娜·蒙泰罗, 帕特里克·莫尔斯, 亚历克西斯·奥布莱特, 埃里希·奥申, 米克·奥塔玛, 基诺·帕克, 阿列克谢·波洛, 米奇·普拉特, 杰伊·雷诺兹, 德克兰·拉塞尔, 伯努瓦·鲁伊斯, 帕特里克·沙贝,亚历克斯·施沃勒、乔纳森·斯克鲁格斯、谢尔盖·沙里宾、马克·西森、桑迪普·舒克拉、克里夫·斯坦、斯蒂芬·斯坦巴赫、卢雅·钦巴兰加、埃斯特万·托瓦利亚里、布莱希特·范·洛梅尔、蒂博·韦尔涅、亚历山大·冯·克诺林、艾丹·韦尔奇、亚历克斯·威尔斯、罗曼·祖拉克。 (按字母顺序列出;如果我们遗漏了任何人,那是无意的,请告诉我们。)
我们无法对索尼影业 Imageworks 的经理们表达足够的谢意,他们让这个项目得以继续进行,全心全意地支持它,并允许我们发布源代码,特别是 Rob Bredow、Brian Keeney、Barbara Ford、Rene Limberger、Erik Strauss 和 Mike福特。
还要非常感谢 SPI 的裂纹着色团队,以及愿意在他们的节目中使用 OSL 的勇敢的外观开发 TD 和 CG 主管。他们充当我们的实验对象、灵感、测试者和反馈的绝佳来源。当然,还有许多其他地方的工程师、技术总监和艺术家将 OSL 融入到他们的产品和流程中,尤其是 Chaos Group、Double Negative、Pixar、DNA、Isotropix 和 Animal Logic 的早期冒险者。谢谢您,我们希望我们能够满足您的需求。
OSL 并不是孤立开发的。我们感谢那些耐心阅读语言规范的早期草稿并为我们提供非常有用的反馈和其他想法的个人和工作室,以及其他 VFX 和动画工作室的当前开发人员和用户的持续贡献和反馈。
OSL 实现依赖于其他几个开源包,所有这些都具有兼容的许可证:
OSL 的文档包含 Markdeep (c) 2015-2016、Morgan McGuire 和highlight.js (c) 2006、Ivan Sagalaev 的部分内容,两者均在 BSD 许可证下分发。