2

私は現在、オーディオから引き出された 256 の長さの int 配列を通過する GLSL シェーダーに取り組んでいます。実際のレンダリングには 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>

これにより、青と緑のみの典型的な「ジュリアセット」エクスプローラーが作成されます。これは、オーディオの再生がない場合に意味がありますが、オーディオの再生が開始されると、浮動小数点数「a」がゼロ以外になると予想されるため、赤がセットに導入されます。そうは言っても、オーディオ全体を通して、赤は表示されません (オーディオ [20] が実際にゼロでないことも確認しましたが.

繰り返しますが、私は GLSL の完全な初心者なので、問題が痛々しいほど明らかである場合は申し訳ありませんが、助けていただければ幸いです。

前もって感謝します!アイザック

4

0 に答える 0