“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情”
正文
接上一篇文章 OSL 着色器入门简介,接着来介绍一下如何在 Blender 的 Cycles 渲染器中使用 OSL 着色器
Blender 中的 Cycles 渲染引擎有一个非常方便的 OSL Shader 开发和使用工作流。
着色器既可以从外部文件加载,也可以直接在 Blender 中编写和编译。
在你开始之前
确保你的 Blender 场景设置为使用 Cycles
渲染引擎,在 CPU
渲染模式下,并检查选项 Open Shading Language
:
在 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
节点:
第三步,将 Script
节点的模式设置为 Internal
模式,然后从 Script
节点的 source
下拉菜单中选择你的着色器的文本:
第四步,如果着色器编译成功,Script
节点将显示其输入和输出参数,您可以将其输出连接到着色器图中的适当输入。
如果你的着色器是一个材质(颜色闭包),将它直接连接到材质输出节点的
Surface
输入,如果它是一个体积则连接到对应的Volume
输入,或者如果它是其他材质输入所需的一个纹理,根据需要进行连接。
第五步, 如果着色器代码包含错误,它将无法编译通过,你可以在 Blender 的系统控制台窗口中阅读错误消息:
第六步,修复错误或更新着色器的代码后,按 Script
节点上的Script Node Update
按钮重新编译着色器:
加载外部 OSL 着色器到 Cycles
与上一节描述的工作流程完全相同,除了将 Script
节点的模式设置为 External
,并在 Script
节点中输入 着色器文件的路径,或者使用 文件浏览器 按下文件夹按钮来定位它:
参考
- OSL read-list
- What are OSL shaders?
- Using OSL shaders in Arnold for Maya
- Using OSL shaders in V-ray for 3ds max
- Writing a basic OSL color shader
- 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 则更适合于需要复杂材质和光照处理的离线渲染。选择哪一种取决于具体的应用需求。