ShaderToy如何将声音加载到纹理中
How does ShaderToy load sounds into a texture
我一直在尝试使用 shadertoy 将音频 frequency/waveform 传递到带有 three.js 的着色器中。
https://www.shadertoy.com/view/Xds3Rr
在此示例中,IQ 似乎将 frequency/waveform 音频数据放入图像中,然后将其采样为着色器中的纹理。我将如何在 Javascript 中创建音频纹理?
明确地说,我不需要帮助将纹理统一加载到着色器中。我只是不知道如何从音频文件创建音频纹理。
var texture = new THREE.Texture();
shader.uniforms = {
iChannel0: { type: 't', value: texture }
};
我猜我需要以某种方式将音频数据放入纹理中,我只是不知道该怎么做。
您可以从网络音频中获取音频数据API正在创建一个分析器节点
const audioContext = new window.AudioContext();
const analyser = audioContext.createAnalyser();
然后创建一个缓冲区来接收数据
const numSamples = analyser.frequencyBinCount;
const audioData = new Uint8Array(numSamples);
然后在渲染循环中获取数据并将其放入纹理
analyser.getByteFrequencyData(audioData);
...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, numSamples, 1, 0,
gl.LUMINANCE, gl.UNSIGNED_BYTE, audioData);
或在three.js中使用DataTexture
这是简短的版本。更长的版本是音频需要在同一个域中,否则您将 运行 陷入 CORS 问题。要获取音频流的数据,例如 <audio>
标签,您可以调用
const source = audioContext.createMediaElementSource(audio);
目前在移动 Chrome 和移动 Safari 中都不起作用,而且 Safari 中存在错误。
我一直在尝试使用 shadertoy 将音频 frequency/waveform 传递到带有 three.js 的着色器中。
https://www.shadertoy.com/view/Xds3Rr
在此示例中,IQ 似乎将 frequency/waveform 音频数据放入图像中,然后将其采样为着色器中的纹理。我将如何在 Javascript 中创建音频纹理?
明确地说,我不需要帮助将纹理统一加载到着色器中。我只是不知道如何从音频文件创建音频纹理。
var texture = new THREE.Texture();
shader.uniforms = {
iChannel0: { type: 't', value: texture }
};
我猜我需要以某种方式将音频数据放入纹理中,我只是不知道该怎么做。
您可以从网络音频中获取音频数据API正在创建一个分析器节点
const audioContext = new window.AudioContext();
const analyser = audioContext.createAnalyser();
然后创建一个缓冲区来接收数据
const numSamples = analyser.frequencyBinCount;
const audioData = new Uint8Array(numSamples);
然后在渲染循环中获取数据并将其放入纹理
analyser.getByteFrequencyData(audioData);
...
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, numSamples, 1, 0,
gl.LUMINANCE, gl.UNSIGNED_BYTE, audioData);
或在three.js中使用DataTexture
这是简短的版本。更长的版本是音频需要在同一个域中,否则您将 运行 陷入 CORS 问题。要获取音频流的数据,例如 <audio>
标签,您可以调用
const source = audioContext.createMediaElementSource(audio);
目前在移动 Chrome 和移动 Safari 中都不起作用,而且 Safari 中存在错误。