0

次のシェーダーがあるとします。

uniform float input[]
float do_stuff(int index) {
    return input[index];
}

このコードは、 のサイズを気にせずに、いくつかのデータを使用して何かを行いますinputただし、プログラムは、サイズを認識して呼び出す別のシェーダーとリンクされます。

void do_stuff(int);

uniform float input[3];
void main() {
    gl_FragColor = vec4(do_stuff(input[0]),
                        do_stuff(input[1]),
                        do_stuff(input[2]),
                        1);
}

明らかに、このコードはばかげています。必要なものを示すために作成しただけです。私の実際の状況は、「do stuff」シェーダー アクセスが事前定義されていないデータであり、各「do stuff」シェーダーには独自のデータがあります。また、「do stuff」シェーダーは、それが何回呼び出されるかを知ることができないため、その入力はサイズが定義されていない配列です。一方、「caller」シェーダーは実行時に生成され、「do_stuff」シェーダーが使用するデータとその数を正確に認識します。

実際には、"do stuff" シェーダーはユーザーが提供し、"caller" シェーダーはそれらを混ぜ合わせます。

そのため、「do stuff」シェーダーを少し前処理することで、パラメーターを使用して問題を解決できるかもしれませんが、少し複雑になります (各「do stuff」シェーダーは異なる関数シグネチャを持っているため)。これらの未定義のサイズのユニフォームを作成できれば、簡単になります。

また、私は提案を受け入れています...

4

0 に答える 0