2011-11-11 19 views
57

私はOpenGLのライトを残して、自分で作ってみたいです。 私は、シェーダがさまざまな数のライトを許可したいと思います。GLSL/C++:ユニフォームの配列?

GLSLシェーダでユニフォームの配列を宣言できますか? もしそうなら、私たちはそのユニフォームの値をどのように設定するのですか?

+4

可変数のライトが必要な人は、まともな容量のアレイを作成し、現在アクティブなライトの数を維持してください。 GLSLでは可変サイズの配列は使用できません(すべての配列サイズは定数でハードコードされた値でなければなりません)。 – Miles

答えて

71

はいこれが可能です。あなたは、Cでのやり方と似た、一様な配列を宣言します。

uniform float v[10]; 

次に、あなたは、はい、GLSLシェーダに制服の配列を宣言することが可能であるglUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...}; 
glUniform1fv(glGetUniformLocation(program, "v"), 10, v); 
+2

1、2、3、4は何を指していますか?つまり、配列の値を最大4つのメンバーにしか設定できないということですか? – Miles

+0

これは 'glUniform1fv'の非常に巧妙な/ねじれた使用です。 'glUniform1fv'の2番目のパラメータは単なる書式であり、常に1として使うべきだと考えるでしょう。 – bobobobo

+0

技術的には、' glUniform1fv(uniformId、4、v);を使って均一な 'vec4'を設定することができます。 'v'は4つの浮動小数点数の配列です。 – bobobobo

7

を使用してその値を設定することができます。いくつかの例のためにgoogle "glsl uniform array"(編集:またはdatenwolfの例を参照)。しかし、いくつかのユニフォームを異なるグラフィックスカードに送ることができる制限があります(少なくとも古いものでは、私は現在のものについて確信していません。

ユニフォームのルートを下ることに決めたら、ユニフォームバッファを使うことをお勧めします。 http://www.opengl.org/wiki/Uniform_Buffer_Objectによれば、「均一なバッファ結合の切り替えは、通常、プログラム内の数十のユニフォームの切り替えよりも高速です。

ライトとパラメータが多数ある場合は、データをフロートバッファとして送信することもできます。

+6

ユニフォームバッファオブジェクトは、GLバージョン3.1以降でのみ使用できます。バージョン2.0以来、ARB_Uniform_Buffer_Object拡張が必要です。 –

+54

「glsl uniform array」というグーグルが最初の結果としてこのページを返すようになりました!!さて何をしようか? – mlvljr

+1

実行時にOpenGLに照会して、Glint resultでユニフォームの最大数を取得することができます。 glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS、0、&result); ' – rwols