web-dev-qa-db-ja.com

制服のGLSL配列を作成しますか?

OpenGLのライトを残して、自分で作成したいと思います。シェーダーで可変数のライトを使用できるようにします。

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

62
Miles

はい、これは可能です。 Cで行う方法と同様の均一な配列を宣言します。

uniform float v[10];

次に、glUniform{1,2,3,4}{f,i}vを使用して値を設定できます

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

はい、GLSLシェーダーでユニフォームの配列を宣言できます。いくつかの例については、「glsl uniform array」をグーグルで検索してください(編集:またはdatenwolfの例を参照)。ただし、異なるグラフィックカードに送ることができるユニフォームの数には制限があります(少なくとも古いものでは、現在のものについてはわかりません(まだあると思いますが))。

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

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

6
NickLH