就新 materials/BSDFs 而言,开放着色语言 (OSL) 的限制到底是什么?

What exactly are the limits of Open Shading Language (OSL) in terms of new materials/BSDFs?

我正在研究 BRDF 描述和实现技术,而 OSL 是这样做的主要语言之一。我很好奇人们可以使用 OSL 实现新 BRDF 的方式,或者是否有可能这样做而不用弄乱它的 source code

OSL 文档提供了一组 material 任何渲染器都需要的。例如,Blender 提供了一组扩展的已实现 materials 准备好在 OSL 中使用(这些 materials 实际上已经作为 Cycles 中的节点可用)。我有兴趣创建新的 materials (BRDF)。根据 this thread,OSL 不应该像这样使用,相反,用户应该利用已经可用的 material 闭包(BSDF)来创建新的 material。该线程中的 OP 试图实现 BRDF 但无法取得进展,因为他找不到获得所需某些向量的方法。

最后,我的问题是:为了在 OSL 中创建新的 materials (BRDF),是否有必要先在 C++ 中实现它们并重新编译 OSL,最终使它们可用?我找不到这个问题的明确答案。

从 OSL 规范中的介绍开始,

OSL’s surface and volume shaders compute an explicit symbolic description, called a ”closure”, of the way a surface or volume scatters light, in units of radiance.

在 blender 中,带有绿色输出套接字的循环节点是 "closure" 节点,它们提供 BRDF/BSDF 计算以呈现渲染中的外观。 Cycles 提供可用的闭包类型,OSL 无法实现新的闭包类型。

所以是的,您必须更改搅拌器代码以提供不同的闭包类型,但 OSL 脚本可以向循环节点树添加大量自定义,而无需更改搅拌器代码。 OSL 脚本是使用 LLVM 的 JIT compiler 编译到 运行 在当前正在使用的 CPU 上。因此,OSL 脚本将 "inject" 新代码添加到渲染引擎中,它仅在改变最终结果的方式上受到限制。

请注意,OSL 脚本不必提供闭包输出,它可以输出浮点值或颜色值,从而允许它在节点树中提供中间节点。

作为示例 OSL 脚本,LGHexTiles.osl provides a complete node that can be used by itself as a material. While the MAscales.osl 提供颜色和浮点输出,仅在 material 中形成一个节点。

和许多事情一样,OSL 脚本也可能被滥用。 Here 您会找到有关在 OSL 脚本中实现的旧 Amiga 杂耍者的信息。是的,一个简单的渲染引擎,用 OSL 编写。我很确定他会继续进一步开发光线追踪器。