我想做一个音频输入可视化与相位器3,我试图让麦克风输入到一个着色器,但我找不到一种方法来使它的工作。
我对着色器有一个基本的了解,我可以处理图像纹理,但我真的不知道如何提供声音。我检查了一个用three.js制作的工作示例:three.js webaudio - visualizer和我已经设法从麦克风获得声音输入作为1024个数字的Uint8Array。
下面是我使用的着色器:
// simplesound.gsl.js
#ifdef GL_ES
precision highp float;
#endif
precision mediump float;
uniform vec2 resolution;
uniform sampler2D iChannel0;
varying vec2 fragCoord;
void main() {
vec2 uv = fragCoord.xy / resolution.xy;
vec2 mu = texture2D(iChannel0, uv).rg;
float y = uv.y - mu.x;
y = smoothstep(0., 0.02, abs(y - 0.1));
gl_FragColor = vec4(y);
}
这是我的场景代码,尝试让它工作:
import Phaser from 'phaser';
// This will provide the array mentioned above with code that will use `navigator.getUserMedia`.
import { setupAudioContext } from '../audiostream';
export default class MainScene2 extends Phaser.Scene {
constructor() {
super({ key: 'MainScene2' });
}
preload() {
this.load.glsl('simplesound', '/static/simplesound.glsl.js');
}
create() {
this.shader = this.add.shader('simplesound', 400, 300, 800, 600);
// When the user presses the 'g' key we will start listening for mic input
const GKey = this.input.keyboard.addKey('G');
GKey.on('down', () => {
setupAudioContext((array) => {
// this array is the array mentioned above, in the three.js example they do something like creating
// a texture from this input and providing that texture to the shader uniform. I tried different things but
// nothing worked :(
//
// I tried using this.shader.setChannel0 and this.shader.setUniform but nothing seems to work as well.
});
});
}
}
我已经尝试了一段时间,但无法得到任何东西:(
2条答案
按热度按时间wyyhbhjk1#
对于一个可能的解决方案没有着色器,通过使用只使用相位器和javascript可以看起来像这样 (真的没有着色器,但我也真的很感兴趣的着色器版本,会看起来像)。
在这个演示中,我使用的是来自音频文件的数据。* 因此,它适用于您的用例,您只需将麦克风数据插入
data
变量。*点击并等待几秒钟。**顺便说一句:**我添加了一些屏幕抖动,给演示更多的果汁。
基本上,此应用程序 "仅" 根据从音频数组(从音频文件加载)返回的值更改每个标记的Y位置。
***免责声明:*这是粗略的演示代码,如果要在生产中使用,可能需要进行一些清理/改进。
rekjcdws2#
在对***glsl***进行了一次短暂的深入研究之后,在开始理解着色器和周围的概念之后,我发现了着色器是如何与相位器一起工作的(至少在这个任务中),它实际上是非常优雅和简单的,它是如何实现的。
1.在
preload
中加载着色器1.将着色器添加到
scene
,例如在create
函数中1.在
create
函数中创建两个要传递给着色器的纹理(以便可以交换它们)1.在
update
函数中,创建表示***音频数据***的纹理1.最后更新 * next * 纹理,并将新创建的纹理的新texture-key传递给
shader
当然,这段代码可以用函数、更好的变量和纹理键命名来优化,但这是留给读者的。