1

均一な配列を介してシェーダーにライトとライトカラーの情報を渡そうとしています。これらをシェーダーで次のように宣言しました。

     uniform vec2 lightpositions[4];
     uniform vec4 lightcolors[4];

そして私のコード(C ++)では:

float lightpositions[8] = { 
        150, 150,
        (float) screenWidth - 150, 150,
        (float) screenWidth - 150, (float) screenHeight - 150,
        150, (float) screenHeight - 150
};

float lightcolors[16] = {
        1.0, 0.0, 0.0, 1.0,
        1.0, 1.0, 0.0, 1.0,
        1.0, 0.0, 1.0, 1.0,
        0.0, 1.0, 1.0, 1.0
};

glUniform2fv(lightposHandle, amount, lightpositions);
checkGlError("lightPositions");

glUniform4fv(lightcolorHandle, amount, lightcolors);
checkGlError("lightColors");

この場合、amount は 4 です。

OpenGL ES デバッガー (PerfHud ES) をチェックすると、配列の値が 1.4e+02 のようにほぼランダムであることがわかります。

私は何か間違ったことをしていますか?または、この場合属性を使用する必要がありますか?

4

3 に答える 3

1

シェーダーは正しいように見えます (非常によく似た宣言については、 「ESSL 仕様」のセクション 4.1.9 を参照してください)。API コードも正しいようです。

私の推測では、均一な場所を照会すると何か問題が発生し、1 つ以上の場所が -1 として返されるということです。-1 が返されたかどうか、glGetUniformLocation を呼び出すたびにチェックしてみてください。

(投稿した描画コードの glGetUniformLocation の呼び出しで使用されている名前は、質問のシェーダー コードと一致しません。これは、探しているバグである可能性があります。)

于 2013-06-11T21:20:45.277 に答える
0

わかりました私はそれを解決しました。

クラスで配列を作成し、コンストラクターを介して Lights クラスに渡しました。私のライトクラスがこの配列をプライベート float* lightpositions に割り当てる場所。これが間違った値の原因でした。なぜなら、(誰かがこれを明確にすることができれば) 配列のアドレスを渡していたと思うからです。通常の配列 (float test[8]) を作成すると、シェーダーに渡される値は正しくなります。

于 2013-06-16T09:14:14.540 に答える