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

Javascript 纹理是将音频数据传输到GLSL的唯一方法吗?,javascript,glsl,webgl,Javascript,Glsl,Webgl,我看到一篇文章,其中一位开发人员正在使用着色器编程构建音乐可视化工具。他通过纹理将音频信息传输到glsl 功能copyAudioDataToTexture(gl、audioData、textureArray){ for(设i=0;i

我看到一篇文章,其中一位开发人员正在使用着色器编程构建音乐可视化工具。他通过纹理将音频信息传输到glsl

功能copyAudioDataToTexture(gl、audioData、textureArray){
for(设i=0;i
我也注意到了

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


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

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

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

“统一”只是在着色器程序中接收全局数据的一种方法,就像要传入纹理以用于对图像进行着色或变换一样。作者正在使用它通过其片段着色器中的
均匀采样2D光谱
传入纹理

如果纹理不适合你,因为你想把GPU用于可视化以外的东西,那么你可能想考虑使用像OpenCL或DUNCTULT之类的东西,它是用来做任意计算的。
(顺便说一句,在那个例子中没有使用HLSL,因为HLSL是Direct3D中使用的语言。作者使用的是GLSL。)

所以我猜他毕竟是在使用制服。但奇怪的是,他使用了纹理(2D)。不能仅仅通过统一发送一个数组?可能是因为你可以在任意点(比如浮点坐标)从纹理中采样,所以他不必担心他的输出图像与他的输入图像的尺寸匹配。对于数组,只能从整数位置读取。你可以拥有的比要小得多。哇,我不知道,目前有很大一部分硬件只允许统一的数组大小为64。听起来你是webgl新手。我建议@gman谢谢,我会查一下的。我对着色器特别感兴趣。shadertoy.com非常有帮助。
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)
}