简体中文
English 简体中文 繁體中文
Methodox 首页

Shader Lab

可用性:Divooka Explore 支持级别:实验性 类别:图形

着色器开发是这样一类主题:乍看之下遥不可及,可一旦深入其中,你就会为之着迷。

欢迎来到函数式着色器的世界!如果你能入门,就能尽情享受确定性并行计算的魅力与美感。我们会尽最大努力与你分享,帮助你上手,并让你体会到我们所经历的乐趣。

Shader Lab 图形用户界面

你可以用它做什么?着色器本身就是强大的玩具。请看这位作者的一些精彩示例。

概述

Shader Lab 是一个基于节点、由代码驱动的环境,用于在 Divooka 中构建实时 GPU 着色器。你可以通过以下任一方式设计视觉效果:

  • 以可视化方式连接节点,或
  • 直接编写 GLSL 片段着色器

着色器完全在 GPU 上运行,因此非常适合:

  • 程序化视觉效果
  • 动画
  • 生成艺术
  • 后期处理效果

Shader Lab 在概念上类似于 ShaderToy 之类的工具或游戏引擎中基于节点的材质编辑器,但专为在 Divooka 中快速实验而设计。它最适合时域动画。它最初是为 2D 程序化效果开发的;事实证明,当我们去掉所有约束和(3D 渲染)管线阶段、只专注于并行计算时(如 Applets 一节所示),片段着色器的通用计算能力才真正大放异彩。

用法

此示例展示了一个简单的着色器图,它输出随时间变化的同心圆环动画。

使用 Shader Lab 通常包括:

  1. 定义输入(分辨率和时间等 uniform)
  2. 构建逻辑(通过节点或 GLSL)
  3. 实时渲染到画布

关键概念:

  • 片段着色器:逐像素计算颜色
  • 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)构建形状的工具。

概念:

  • 距离场
  • 形状组合(并集、差集)

光线步进浏览器

Divooka Shader Lab 光线步进浏览器:在片段着色器中进行光线追踪的 3D 场景

片段着色器通常在 3D 场景对象光栅化之后调用,但如果我们将场景信息编码后直接传给着色器,就可以仅用片段着色器有效地实现光线追踪器。

在这个光线步进浏览器示例中,我们直接在片段着色器中渲染经过光线追踪的 3D 场景。这确实是一个完美的例子,展示了渲染的工作原理,以及执行着色器的小型计算内核所具有的并行能力。

概念:

  • 光线步进
  • 渲染基础

资源