纹理是将音频数据传输到 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。)
我看到一篇文章,其中一位开发人员正在使用着色器编程构建音乐可视化工具。他通过纹理将音频信息传输到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。)