私はOpenGLのライトを残して、自分で作ってみたいです。 私は、シェーダがさまざまな数のライトを許可したいと思います。GLSL/C++:ユニフォームの配列?
GLSLシェーダでユニフォームの配列を宣言できますか? もしそうなら、私たちはそのユニフォームの値をどのように設定するのですか?
私はOpenGLのライトを残して、自分で作ってみたいです。 私は、シェーダがさまざまな数のライトを許可したいと思います。GLSL/C++:ユニフォームの配列?
GLSLシェーダでユニフォームの配列を宣言できますか? もしそうなら、私たちはそのユニフォームの値をどのように設定するのですか?
はいこれが可能です。あなたは、Cでのやり方と似た、一様な配列を宣言します。
uniform float v[10];
次に、あなたは、はい、GLSLシェーダに制服の配列を宣言することが可能であるglUniform{1,2,3,4}{f,i}v
GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
を使用してその値を設定することができます。いくつかの例のためにgoogle "glsl uniform array"(編集:またはdatenwolfの例を参照)。しかし、いくつかのユニフォームを異なるグラフィックスカードに送ることができる制限があります(少なくとも古いものでは、私は現在のものについて確信していません。
ユニフォームのルートを下ることに決めたら、ユニフォームバッファを使うことをお勧めします。 http://www.opengl.org/wiki/Uniform_Buffer_Objectによれば、「均一なバッファ結合の切り替えは、通常、プログラム内の数十のユニフォームの切り替えよりも高速です。
ライトとパラメータが多数ある場合は、データをフロートバッファとして送信することもできます。
可変数のライトが必要な人は、まともな容量のアレイを作成し、現在アクティブなライトの数を維持してください。 GLSLでは可変サイズの配列は使用できません(すべての配列サイズは定数でハードコードされた値でなければなりません)。 – Miles