我正在使用WebGL和Three.js构建一个小型音乐可视化工具,使用ThreeAudio.js库将音频转换为传递到着色器的纹理。尽管目前一切正常,但我收到以下错误,我想追踪:
"未捕获的类型错误:类型错误"
然后从我的动画函数,到我的渲染函数,到三.js渲染函数,到称为"l"的东西,到渲染缓冲区,到"z"。
我的动画函数如下:
function animate() {
requestAnimationFrame( animate );
audioTextures.update();
stats.update();
render();
}
我的渲染函数如下:
function render(){
renderer.render( scene, camera );
}
我相信这是我正在创建的网格的问题,因为当我注释掉代码以将其添加到场景中时,错误就会消失。
我拥有的动画球体的代码如下:
audioSource = (new ThreeAudio.Source()).load('https://api.soundcloud.com/tracks/125098652/stream?client_id=MYCLIENTID').play();
audioTextures = new ThreeAudio.Textures(renderer, audioSource);
audioMaterial = new ThreeAudio.Material(audioTextures, vertexShader, fragmentShader);
audioMesh = new THREE.Mesh(geometry, audioMaterial);
scene.add(audioMesh);
ThreeAudio github可以在这里找到:https://github.com/unconed/ThreeAudio.js请让我知道发布我的着色器是否有帮助。
有谁知道我应该如何开始解决此错误?有没有人看到它以这种方式出现?请让我知道。
好的,我最终自己回答了这个问题。如果有人偶然发现这个寻找类似问题的答案,这就是我解决它的方式:
我意识到在加载音频源之前调用了 animate 函数,这意味着音频纹理中没有任何数据。似乎我使用的库(ThreeAudio)处理了异常,在我有限的经验中,数据到达着色器的问题往往会炸毁一切。
解决方案是在加载音频源后将 animate() 调用移动到回调函数中。我的代码如下所示:
audioSource = (new ThreeAudio.Source()).load('https://api.soundcloud.com/tracks/125098652/stream?client_id=MYCLIENTID', function(){
clock = new THREE.Clock();
audioSource.play();
audioTextures = new ThreeAudio.Textures(renderer, audioSource);
audioMaterial = new ThreeAudio.Material(audioTextures, vertexShader, fragmentShader);
audioMaterial.uniforms['volume'] = {type: 'f', value: 0};
audioMaterial.uniforms['volume2'] = {type: 'f', value: 0};
audioMaterial.uniforms['volume3'] = {type: 'f', value: 0};
// My custom cube geometry
var geometry = CubeGeometry(audioTextures, 500, 500, 500, 500, 500);
audioMesh = new THREE.Mesh(geometry, audioMaterial);
audioMesh.position.y = -200;
scene.add(audioMesh);
animate();
});