GLSL数组没有传递数据

时间:2013-05-25 06:51:21

标签: javascript three.js glsl shader web-audio

我目前正在研究GLSL着色器,该着色器通过从音频中提取的256个长度的整数数组。我正在使用Javascript和Three.js来进行实际渲染。我先在脚本中首先定义一个制服列表来获取音频对象:

uniforms1 = {
    time: { type: "f", value: 1.0 },
    resolution: { type: "v2", value: new THREE.Vector2() },
    mouse: { type: "v2", value: new THREE.Vector2() },
    audio:{ type: "int", value: new Array(256) },
};

每个渲染帧,我调用以下内容:

freqByteData = new Uint8Array(audio.analyser.frequencyBinCount); 
audio.analyser.getByteFrequencyData(freqByteData);
uniforms1.audio.value = freqByteData;

audio.analyser是一个Web音频分析器节点。这部分代码工作正常,我已经验证uniforms1.audio是一个填充了分析器数据的Uint8Array。我遇到的问题是我似乎无法将这些数据拉入片段着色器本身。我对GLSL很新,所以我认为这是一个基本问题,但我花了一些时间寻找解决方案,似乎找不到一个。下面是片段着色器代码:

<script id="fragment_shader2" type="x-shader/x-fragment">

        uniform vec2 resolution;
        uniform float time;
        uniform vec2 mouse;
        uniform int audio[256];

        #define N 100
        void main( void ) {

            vec2 v = (gl_FragCoord.xy - resolution) / min(resolution.y,resolution.x) *0.5;

            float pi2 = 3.1415926535 * 2.0;
            float C = cos(mouse.x * pi2);
            float S = sin(mouse.y * pi2);
            //C = v.x;
            //S = v.y;

            float a = float(audio[20]/100);
            for ( int i = 0; i < N; i++ ){
                float x = v.x*v.x - v.y*v.y + C;
                float y = v.y * v.x + v.x * v.y+ S;
                v = vec2(x,y);
            }

            float col = v.x*v.x + v.y*v.y;

            gl_FragColor = vec4( a, sin(col*3.0), (cos(col)+sin(col))/2.0, 1.0 );

        }
    </script>

这创建了一个典型的'Julia Set'资源管理器,只有蓝调和绿色,这在没有音频播放时是有意义的,但是,我希望当音频开始播放时,浮动'a'将为非零,因此红色将被引入该集合。话虽如此,在整个音频中,没有红色可见(即使我也检查过以确保音频[20]确实非零。

同样,我是GLSL的完全新手,所以如果问题很明显,我很抱歉,但感谢任何帮助。

提前致谢! 艾萨克

0 个答案:

没有答案