Shader Lab
可用性:Divooka Explore 支持级别:实验性 类别:图形
着色器开发是这样一类主题:乍看之下遥不可及,可一旦深入其中,你就会为之着迷。
欢迎来到函数式着色器的世界!如果你能入门,就能尽情享受确定性并行计算的魅力与美感。我们会尽最大努力与你分享,帮助你上手,并让你体会到我们所经历的乐趣。

你可以用它做什么?着色器本身就是强大的玩具。请看这位作者的一些精彩示例。
概述
Shader Lab 是一个基于节点、由代码驱动的环境,用于在 Divooka 中构建实时 GPU 着色器。你可以通过以下任一方式设计视觉效果:
- 以可视化方式连接节点,或
- 直接编写 GLSL 片段着色器
着色器完全在 GPU 上运行,因此非常适合:
- 程序化视觉效果
- 动画
- 生成艺术
- 后期处理效果
Shader Lab 在概念上类似于 ShaderToy 之类的工具或游戏引擎中基于节点的材质编辑器,但专为在 Divooka 中快速实验而设计。它最适合时域动画。它最初是为 2D 程序化效果开发的;事实证明,当我们去掉所有约束和(3D 渲染)管线阶段、只专注于并行计算时(如 Applets 一节所示),片段着色器的通用计算能力才真正大放异彩。
用法

此示例展示了一个简单的着色器图,它输出随时间变化的同心圆环动画。
使用 Shader Lab 通常包括:
- 定义输入(分辨率和时间等 uniform)
- 构建逻辑(通过节点或 GLSL)
- 实时渲染到画布
关键概念:
- 片段着色器:逐像素计算颜色
- UV 坐标:归一化的像素位置(0–1)
- Uniform:外部输入(时间、分辨率、参数)
节点

交互演示
交互演示让你可以直接试验 GLSL 着色器。
你可以使用下方的 WebGL 界面直接测试着色器。请注意,此交互演示使用 u_ 作为 uniform 的前缀,而其他平台(例如 ShaderType)可能使用 iXXXX 形式的 uniform。
片段着色器
在示例页面中浏览更多内容。
默认着色器
precision mediump float;
uniform vec2 u_Resolution;
uniform float u_Time;
void main() {
vec2 uv = gl_FragCoord.xy / u_Resolution;
gl_FragColor = vec4(uv, abs(sin(u_Time)), 1.0);
}
作用说明
- 将像素坐标归一化(
uv) - 将其直接映射为颜色(渐变)
- 使用
sin(time)为蓝色通道添加动画
试一试
提示:试着将 main() 改为以下内容:
void main()
{
vec2 p = (gl_FragCoord.xy * 2.0 - u_Resolution) / u_Resolution.y;
float v = 0.5 + 0.5 * sin(10.0 * length(p) - u_Time * 3.0);
vec3 col = 0.5 + 0.5 * cos(u_Time + vec3(0.0, 2.0, 4.0) + v * 4.0);
gl_FragColor = vec4(col, 1.0);
}
演示内容
- 用径向距离(
length(p))生成圆形图案 - 基于时间的动画
- 使用余弦偏移实现颜色循环
- 不使用纹理的程序化图案生成
示例
下面是一些可实现效果的示例。在示例页面中浏览更多有趣的示例。
Uniform 渐变


一个将 UV 坐标直接映射为颜色的基础着色器。
概念:
- UV 归一化
- 直接颜色映射
- 无动画
同心圆环


使用距离函数生成重复的圆形图案。
概念:
- 到中心的距离(
length) - 周期函数(
sin) - 图案重复
小程序
加入一点交互性后,着色器就能用来创建动态得多的输出。
Mandelbrot

使用迭代复数运算的交互式分形渲染。
概念:
- 迭代计算
- 逃逸时间算法
- 复数可视化
有向距离编辑器

使用有向距离场(SDF)构建形状的工具。
概念:
- 距离场
- 形状组合(并集、差集)
光线步进浏览器

片段着色器通常在 3D 场景对象光栅化之后调用,但如果我们将场景信息编码后直接传给着色器,就可以仅用片段着色器有效地实现光线追踪器。
在这个光线步进浏览器示例中,我们直接在片段着色器中渲染经过光线追踪的 3D 场景。这确实是一个完美的例子,展示了渲染的工作原理,以及执行着色器的小型计算内核所具有的并行能力。
概念:
- 光线步进
- 渲染基础
资源
- 示例
- The Book of Shaders – 着色器编程的基础指南
- The Book of Shaders(在线编辑器) – 实时试验 GLSL
- Shader Toy