开放式着色语言 (OSL)

仅适用于Cycles引擎

用户可以通过使用 开放着色语言(Open Shading Language) 创建自己的结点 。注意这些结点只能在CPU渲染下运行;现在不支持OSL代码工作在GPU下的方式。

要开启这块功能,在渲染设置的着色器系统中选择开放式着色语言。

Note

在Linux上,C/C++ 编译工具 (通常来说是/usr/bin/cpp) 必须要安装来编译OSL脚本。

脚本节点

../../_images/render_shader-nodes_osl_script-node.png脚本节点。

OSL是专门为节点着色器式的渲染模式设计的,节点图里面一个着色器节点就对应着一个OSL着色器。要添加一个OSL着色器,需要在Blender的文本编辑器中添加脚本或者一个外部文件的链接。节点的输入和输出接口会由代码中的各种参数,在Update按钮按下时即时生成。

OSL着色器可以通过几种不同的方式连接到节点。使用内部模式,将使用文本数据块存储OSL着色器,而OSO字节码则存储在节点本身中。这对于分配一个包含所有内容的bl末端文件非常有用。

外部 模式可用于从驱动器指定 .osl 文件,然后它将自动编译成在同一个目录下的 .osl 文件。也可以指定一条路径到 .osl 文件,然后将直接使用,由用户手工完成编译。第三个选项是指定模块名称,它将在着色器搜索路径中查找。

着色器的搜索地址可以在OSL脚本内所指定的地址下找到,如下:

  • Linux
  1. $HOME/.config/blender/2.80/shaders/
  • MS-Windows
  1. C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.80\shaders\
  • macOS
  1. /Users/$USER/Library/Application Support/Blender/2.80/shaders/

Tip

为了制作方便,我们建议利用节点组包装着色器脚本节点,并连接到其他的.blend文件。这样一来,后续可以更容易更改(增加或删除)节点的插口,而不需要更新全部文件里面的代码节点。

着色器写入

要取得更多着色器写入相关的资料,请看 OSL规格文件。这里有一个简单例子:

  1. shader simple_material(
  2. color Diffuse_Color = color(0.6, 0.8, 0.6),
  3. float Noise_Factor = 0.5,
  4. output closure color BSDF = diffuse(N))
  5. {
  6. color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor);
  7. BSDF = material_color * diffuse(N);
  8. }

闭包

OSL 不同于RSL 或 GLSL等,它没有光回路。场景中没有入射光源,而且必须由在渲染引擎本身的闭包中构建。这么一来限制挺多的,但这也使渲染引擎能够进行优化,并确保所有的着色器都能被取样。

在cycles中可用的闭包对应于着色器节点和套接口;对他们所做的更多的细节和参数的意义更多详细信息,请参阅 着色器节点手册

双向散射分布函数

  • diffuse(N)
  • oren_nayar(N, roughness)
  • diffuse_ramp(N, colors[8])
  • phong_ramp(N, exponent, colors[8])
  • diffuse_toon(N, size, smooth)
  • glossy_toon(N, size, smooth)
  • translucent(N)
  • reflection(N)
  • refraction(N, ior)
  • transparent()
  • microfacet_ggx(N, roughness)
  • microfacet_ggx_aniso(N, T, ax, ay)
  • microfacet_ggx_refraction(N, roughness, ior)
  • microfacet_beckmann(N, roughness)
  • microfacet_beckmann_aniso(N, T, ax, ay)
  • microfacet_beckmann_refraction(N, roughness, ior)
  • ashikhmin_shirley(N, T, ax, ay)
  • ashikhmin_velvet(N, roughness)

毛发

  • hair_reflection(N, roughnessu, roughnessv, T, offset)
  • hair_transmission(N, roughnessu, roughnessv, T, offset)
  • principled_hair(N, absorption, roughness, radial_roughness, coat, offset, IOR)

双向散射面反射分布函数

  • bssrdf_cubic(N, radius, texture_blur, sharpness)
  • bssrdf_gaussian(N, radius, texture_blur)

体积

  • henyey_greenstein(g)
  • absorption()

其他

  • emission()
  • ambient_occlusion()
  • holdout()
  • background()

属性

一些物件,粒子和模型属性也可以在自带的 getattribute() 函数取得。 UV贴图和顶点颜色也可以通过他们的名字检索。其他属性如下:

  • geom:generated
  • 生成纹理坐标。
  • geom:uv
  • 默认渲染UV贴图。
  • geom:dupli_generated
  • 例如从其他物件生成坐标。
  • geom:dupli_uv
  • 例如其他物件UV坐标。
  • geom:trianglevertices
  • 三角形的3顶点坐标。
  • geom:numpolyvertices
  • 多边形的顶点数(通常返回值是3)
  • geom:polyvertices
  • 多边形的顶点数(通常返回值是3)
  • geom:name
  • 物件名称。
  • geom:is_curve
  • 物件是否线状。
  • geom:curve_intercept
  • 沿着线形从头至尾。
  • geom:curve_thickness
  • 线的厚度。
  • geom:curve_tangent_normal
  • 线股的切向法线。
  • path:ray_length
  • 光线到达距离。
  • object:location
  • 物件位置。
  • object:index
  • 物件索引号。
  • object:random
  • 通过物件的索引和名称生成的每个对象随机数。
  • material:index
  • 材质索引号。
  • particle:index
  • 粒子实例数量。
  • particle:age
  • 粒子帧寿命。
  • particle:lifetime
  • 粒子在帧的总寿命。
  • particle:location
  • 粒子的位置。
  • particle:size
  • 粒子的大小。
  • particle:velocity
  • 粒子的速度。
  • particle:angular_velocity
  • 粒子的角速度。

跟踪

我们支持“跟踪”(point pos,vector dir,…)“功能,从OSL着色器中追踪光线。”当前不支持“阴影”参数,但是可以从使用 getmessage ("trace")的对象中检索属性功能。请参阅OSL规范了解具体用法。

这个功能不能代替照明;其主要目的是使着色器能够“探测”附近的几何形状,例如,应用可以被几何形状阻挡的投影纹理,应用更多的“磨损”来暴露几何图形,或者使其他环境遮挡效果类似。