2

我正在研究 BRDF 描述和实现技术,而 OSL 是这样做的主要语言之一。我很好奇使用 OSL 实现新 BRDF 的方式,或者是否可以在不弄乱源代码的情况下这样做。

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

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

4

1 回答 1

2

从 OSL 规范中的 Introduction 开始,

OSL 的表面和体积着色器以辐射度为单位计算表面或体积散射光的方式的显式符号描述,称为“闭包”。

在搅拌机中,带有绿色输出套接字的循环节点是“闭包”节点,它们提供BRDF / BSDF计算,从而在渲染中给出外观。Cycles 提供了可用的闭包类型,OSL 无法实现新的闭包类型。

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

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

作为示例 OSL 脚本,LGHexTiles.osl提供了一个完整的节点,可以单独使用它作为材质。而MAscales.osl提供的颜色和浮点输出仅在材质中生成一个节点。

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

于 2019-09-28T10:02:36.567 回答