Blender 使用 OSL 着色器

1,037 阅读4分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情

正文

接上一篇文章 OSL 着色器入门简介,接着来介绍一下如何在 Blender 的 Cycles 渲染器中使用 OSL 着色器

Blender 中的 Cycles 渲染引擎有一个非常方便的 OSL Shader 开发和使用工作流。

着色器既可以从外部文件加载,也可以直接在 Blender 中编写和编译。

在你开始之前

确保你的 Blender 场景设置为使用 Cycles 渲染引擎,在 CPU 渲染模式下,并检查选项 Open Shading Language :

image.png

在 Blender 中编写一个 OSL 着色器

第一步,在 Blender 的文本编辑器中编写着色器代码:

#include "stdosl.h"

surface cglDielectricBasic(
    color col = 0.0,
    float IOR = 1.5,
    float roughness = 0.0,
    normal Normal = N,
    output closure color bsdf = 0)
{
    float A, B;
    float c = fabs(dot(I, Normal));
    float g = IOR * IOR - 1 + c * c;
    float Fr = 1.;
    if(g > 0){
        g = sqrt(g);
        A = (g - c) / (g + c);
        B = (c * (g + c) - 1) / (c * (g - c) + 1);
        Fr = 0.5 * A * A * (1 + B * B);
    }
    bsdf = (col * diffuse(Normal)) * (1 - Fr) + (microfacet("ggx", Normal, (0,0,1), roughness, roughness, 0, 0)) * Fr;
}

第二步,在对象的材质着色器图(着色器编辑器视图)中,

创建一个 Script 节点:

image.png

第三步,将 Script 节点的模式设置为 Internal 模式,然后从 Script 节点的 source 下拉菜单中选择你的着色器的文本:

image.png

第四步,如果着色器编译成功,Script 节点将显示其输入和输出参数,您可以将其输出连接到着色器图中的适当输入。

如果你的着色器是一个材质(颜色闭包),将它直接连接到材质输出节点的 Surface 输入,如果它是一个体积则连接到对应的 Volume 输入,或者如果它是其他材质输入所需的一个纹理,根据需要进行连接。

image.png

第五步, 如果着色器代码包含错误,它将无法编译通过,你可以在 Blender 的系统控制台窗口中阅读错误消息:

image.png

第六步,修复错误或更新着色器的代码后,按 Script 节点上的Script Node Update 按钮重新编译着色器:

image.png

加载外部 OSL 着色器到 Cycles

与上一节描述的工作流程完全相同,除了将 Script 节点的模式设置为 External,并在 Script 节点中输入 着色器文件的路径,或者使用 文件浏览器 按下文件夹按钮来定位它:

image.png

参考

  1. OSL read-list
  2. What are OSL shaders?
  3. Using OSL shaders in Arnold for Maya
  4. Using OSL shaders in V-ray for 3ds max
  5. Writing a basic OSL color shader
  6. Blender 2.83 OSL bug & fix

GLSL 与 OSL 的区别与联系 (2024.9.20 补充)

GLSL(OpenGL Shading Language)和 OSL(Open Shading Language)都是用于编写着色器程序的高级语言,但它们的设计目标、应用场景以及支持的功能有所不同。

GLSL (OpenGL Shading Language):

  • 设计目的: GLSL 是为 OpenGL 图形库设计的,它允许开发者直接在图形硬件上执行自定义的顶点和片段着色器。
  • 应用场景: 主要用于实时渲染,比如游戏开发、虚拟现实应用等,因为它能够充分利用现代 GPU 的强大计算能力。
  • 特点:
    • 支持多种类型的着色器:顶点着色器、片段着色器、几何着色器、曲面细分控制着色器、曲面细分评估着色器和计算着色器。
    • 语法类似于 C 语言,易于学习。
    • 高度集成于 OpenGL API 中。
    • 可以进行实时反馈,适合交互式应用。
  • 局限性: GLSL 着重于提供对底层图形硬件的访问,因此对于更复杂的材质表达和光线追踪等功能的支持较为有限。

OSL (Open Shading Language):

  • 设计目的: OSL 是专为离线渲染而设计的,它的目的是为了创建高度灵活且可移植的材质和照明效果。
  • 应用场景: 主要用于电影制作、视觉效果(VFX)行业以及高质量的动画渲染。
  • 特点:
    • 提供了丰富的材质描述功能,支持各种复杂的材质属性。
    • 具有良好的跨平台兼容性,可以在不同的渲染引擎间共享着色器代码。
    • 支持延迟渲染特性,可以将计算推迟到真正需要时再执行。
    • 语法也类似于 C 语言,但是针对着色器编程做了优化。
    • 强调的是材质的物理正确性和艺术上的灵活性。
  • 局限性: OSL 不是为实时渲染设计的,所以不适合那些需要极高帧率的应用场景。此外,OSL 的实现通常需要一个解释器或者编译器来运行,这可能会影响性能。

联系:

  • 两者都使用类似 C 语言的语法,使得熟悉一种语言的人相对容易过渡到另一种。
  • 它们都提供了编写高性能图形代码的能力,尽管是在不同的上下文中。
  • 两种语言都可以用来描述物体表面的颜色、纹理和其他属性,只是适用的领域不同。

总之,GLSL 更适用于实时图形渲染,而 OSL 则更适合于需要复杂材质和光照处理的离线渲染。选择哪一种取决于具体的应用需求。