OpenGLのライトを残して、自分で作成したいと思います。シェーダーで可変数のライトを使用できるようにします。
GLSLシェーダーでユニフォームの配列を宣言できますか?もしそうなら、これらのユニフォームの値をどのように設定しますか?
はい、これは可能です。 Cで行う方法と同様の均一な配列を宣言します。
uniform float v[10];
次に、glUniform{1,2,3,4}{f,i}v
を使用して値を設定できます
GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
はい、GLSLシェーダーでユニフォームの配列を宣言できます。いくつかの例については、「glsl uniform array」をグーグルで検索してください(編集:またはdatenwolfの例を参照)。ただし、異なるグラフィックカードに送ることができるユニフォームの数には制限があります(少なくとも古いものでは、現在のものについてはわかりません(まだあると思いますが))。
ユニフォームのルートを下る場合は、ユニフォームバッファを使用することをお勧めします。 http://www.opengl.org/wiki/Uniform_Buffer_Object によれば、「均一なバッファバインディングの切り替えは、通常、プログラム内の数十の均一なバッファの切り替えよりも高速です」。
多数のライトとパラメーターがある場合は、データをフロートバッファーとして送信することもできます。