返回

用 GLSL 绘制简单脉冲波(带三角波的半正弦波)

前端

用 GLSL 绘制脉冲波:探索波形生成

简介

在计算机图形学中,波形无处不在,从模拟自然现象到创建逼真的动画。在本文中,我们将深入探讨如何使用 GLSL 绘制一种特定的波形:脉冲波。脉冲波是一种简单的波形,但它具有独特的特性,使其在各种应用中都很有用。

什么是脉冲波?

脉冲波是半正弦波和三角波的组合。半正弦波类似于正弦波,但仅代表其一半。三角波类似于带有尖锐上升和下降边的方波。当半正弦波与三角波相乘时,就会形成脉冲波,具有独特而有趣的形状。

算法原理

要使用 GLSL 绘制脉冲波,我们需要了解其组成部分的算法。

半正弦波:

y = sin(x)
  • y 是波形的振幅
  • x 是波形的相位角

三角波:

y = abs(2 * floor(x / 2) - 1)
  • y 是波形的振幅
  • x 是波形的相位角
  • abs() 是绝对值函数
  • floor() 是向下取整函数

脉冲波:

y = sin(x) * abs(2 * floor(x / 2) - 1)

GLSL 实现

现在我们知道了算法,让我们将它们转换为 GLSL 着色器代码。

片段着色器:

void main() {
  // 计算相位角
  float phase = gl_FragCoord.x;

  // 计算半正弦波
  float semiSin = sin(phase);

  // 计算三角波
  float triangle = abs(2.0 * floor(phase / 2.0) - 1.0);

  // 计算脉冲波
  float pulse = semiSin * triangle;

  // 输出脉冲波
  gl_FragColor = vec4(pulse, pulse, pulse, 1.0);
}

示例代码

为了演示如何使用着色器代码绘制脉冲波,让我们创建一个简单的 JavaScript 代码示例:

// 创建画布
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");

// 编译着色器
const vertexShaderSource = `
  attribute vec2 a_position;

  void main() {
    gl_Position = vec4(a_position, 0.0, 1.0);
  }
`;

const fragmentShaderSource = `
  precision mediump float;

  uniform float u_phase;

  void main() {
    float semiSin = sin(u_phase);
    float triangle = abs(2.0 * floor(u_phase / 2.0) - 1.0);
    float pulse = semiSin * triangle;

    gl_FragColor = vec4(pulse, pulse, pulse, 1.0);
  }
`;

// 创建着色器程序
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

// 设置视口和清除颜色
gl.viewport(0, 0, canvas.width, canvas.height);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

// 使用着色器程序
gl.useProgram(program);

// 设置相位角并绘制
const numVertices = 1000;
for (let i = 0; i < numVertices; i++) {
  // 计算相位角
  const phase = i / numVertices;

  // 设置 uniform
  gl.uniform1f(phaseLocation, phase);

  // 绘制线段
  gl.drawArrays(gl.LINE_STRIP, 0, 2);
}

结论

掌握如何使用 GLSL 绘制脉冲波,为我们打开了一个可能性世界。从模拟音频信号到创建逼真的动画,脉冲波在计算机图形学中无处不在。了解其背后的算法和 GLSL 实现方式,为我们提供了在各种项目中使用它们的强大工具。

常见问题解答

  1. 什么是相位角?

    • 相位角是指定波形在时间或空间上的位置的参数。
  2. 为什么脉冲波是半正弦波和三角波的组合?

    • 通过结合这两种波形,我们可以创建具有独特形状和特性的脉冲波。
  3. 如何修改脉冲波的形状?

    • 可以通过更改半正弦波和三角波的振幅和频率来修改脉冲波的形状。
  4. GLSL 中的 abs() 函数有什么作用?

    • abs() 函数用于计算三角波的绝对值,这给了它尖锐的上升和下降边。
  5. 脉冲波在计算机图形学中有哪些应用?

    • 脉冲波用于模拟音频信号、创建视觉效果和生成逼真的动画。