开放着色语言
It is also possible to create your own nodes using Open Shading Language (OSL). Note that these nodes will only work for CPU rendering; there is no support for running OSL code on the GPU.
要开启这块功能,在渲染设置的着色器系统中选择开放式着色语言。
OSL是专门为节点着色器式的渲染模式设计的,节点图里面一个着色器节点就对应着一个OSL着色器。要添加一个OSL着色器,需要在Blender的文本编辑器中添加脚本或者一个外部文件的链接。节点的输入和输出接口会由代码中的各种参数,在Update按钮按下时即时生成。
OSL着色器可以通过几种不同的方式连接到节点。使用*内部*模式,将使用文本数据块存储OSL着色器,而OSO字节码则存储在节点本身中。这对于分配一个包含所有内容的bl末端文件非常有用。
外部 模式可用于从驱动器指定 文件,然后它将自动编译成在同一个目录下的 .osl
文件。也可以指定一条路径到 .osl
文件,然后将直接使用,由用户手工完成编译。第三个选项是指定模块名称,它将在着色器搜索路径中查找。
着色器的搜索地址可以在OSL脚本内所指定的地址下找到,如下:
Linux
Windows
macOS
Tip
为了制作方便,我们建议利用节点组包装着色器脚本节点,并连接到其他的.blend文件。这样一来,后续可以更容易更改(增加或删除)节点的插口,而不需要更新全部文件里面的代码节点。
For more details on how to write shaders, see the . Here is a simple example:
OSL 不同于RSL 或 GLSL等,它没有光回路。场景中没有入射光源,而且必须由在渲染引擎本身的闭包中构建。这么一来限制挺多的,但这也使渲染引擎能够进行优化,并确保所有的着色器都能被取样。
在cycles中可用的闭包对应于着色器节点和套接口;对他们所做的更多的细节和参数的意义更多详细信息,请参阅 。
diffuse(N)
oren_nayar(N, roughness)
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)
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()
Some object, particle and mesh attributes are available to the built-in getattribute()
function. UV maps and Color Attributes can be retrieved using their name. Other attributes are listed below:
geom:generated
生成纹理坐标。
geom:uv
默认渲染UV贴图。
geom:dupli_generated
For instances, generated coordinate from instancer object.
geom:dupli_uv
For instances, UV coordinate from instancer object.
geom:trianglevertices
Three vertex coordinates of the triangle.
多边形的顶点数(通常返回值是3)
geom:polyvertices
多边形的顶点数(通常返回值是3)
geom:name
物件名称。
geom:is_curve
物件是否线状。
沿着线形从头至尾。
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着色器中追踪光线。”当前不支持“阴影”参数,但是可以从使用 (“trace”)的对象中检索属性功能。请参阅OSL规范了解具体用法。
这个功能不能代替照明;其主要目的是使着色器能够“探测”附近的几何形状,例如,应用可以被几何形状阻挡的投影纹理,应用更多的“磨损”来暴露几何图形,或者使其他环境遮挡效果类似。