纹理是将音频数据传输到 GLSL 的唯一方法吗?

Are textures the only way to transfer audio data into GLSL?

我看到一篇文章,其中一位开发人员正在使用着色器编程构建音乐可视化工具。他通过纹理将音频信息传输到glsl。 https://noisehack.com/build-music-visualizer-web-audio-api/

function copyAudioDataToTexture(gl, audioData, textureArray) {
  for (let i = 0; i < audioData.length; i++) {
    textureArray[4 * i + 0] = audioData[i] // R
    textureArray[4 * i + 1] = audioData[i] // G
    textureArray[4 * i + 2] = audioData[i] // B
    textureArray[4 * i + 3] = 255          // A
  }
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, audioData.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureArray)
}

我也注意到了

我想知道,数据是否通常只通过纹理提交,是否有其他方式将数据导入 glsl,可能作为顶点或其他方式?

编辑:我注意到有一个叫做 'uniform' 的东西,也许我可以将音频数据注入其中?

这取决于你想用它做什么。对于可视化数据,纹理是一个相当自然的选择,因为您的片段着色器(实际为单个像素着色的程序)可以从纹理中的任意位置访问数据,您甚至可以免费获得数据点之间的插值。这对于为屏幕上的像素着色作为可视化数据的一种方式非常方便。在此示例中,他将频谱数据(强度与频率)作为纹理传递,将其乘以输出颜色以使图像变暗,而音频不属于频谱。

在这种情况下,顶点缓冲区不是传递数据的好方法,因为据我所知片段着色器无法从顶点缓冲区读取。

Uniform 只是在着色器程序中接收全局数据的一种方法,就像您要传入纹理以用于对图像进行着色或变换一样。作者使用它通过片段着色器中的 uniform sampler2D spectrum 传递纹理。

如果纹理对您来说没有意义,因为您想将 GPU 用于可视化以外的其他用途,那么您可能需要考虑使用 OpenCL 或 DirectCompute 之类的东西,它们专为进行任意计算而设计。

(顺便说一句,该示例中未使用 HLSL,因为 HLSL 是 Direct3D 中使用的语言。作者使用的是 GLSL。)