1

データのセットをシェーダーのように送信する必要があります。

//Application OpenGL

uniform vec3 *variable; 
variable = (uniform vec3 *)malloc(80 * sizeof(uniform vec3));  

//or    
uniform vec3 variable[80];

インデックスなどのデータやその他の多くのデータを送信する必要があります。

4

1 に答える 1

3

後者のケースが正しいです。GLSL は、可能な限り単純で簡単な実行を行うことに基づいて構築されています。シェーダーにメモリを割り当てることはできません。反復にはコストがかかります。適切に作成された GLSL または HLSL シェーダーは、固定されたデータ セットを取り込み、固定されたデータ セットを出力します。これにより、並列実行が非常に高速になります。これは私の骨格頂点シェーダーです。

 #version 110

uniform mat4 transform[ 32 ];

in int boneID;

void main()
{

    gl_FrontColor = gl_Color;
    gl_Position = transform[ boneID ] * gl_Vertex;

}

C/++ 側では、glUniformMatrix4fv を呼び出すときに、複数の行列の配列を指定してその数を伝えると、それらが個別の値として GLSL に取り込まれます。

私のコードは GLSL の古いバージョンに基づいて構築されており、gl_Vertex などの多くの廃止された要素を使用していることに注意してください。

于 2013-06-03T09:28:43.943 に答える