1

vec4 の配列を OpenGL のフラグメント シェーダーに均一に渡したいのですが、思ったよりもずっと難しいようです。GLfloat の配列を渡してシェーダーで vec4 を再構築しようとしているところまで来ましたが、それでも機能しません。

私はvshaderで宣言しようとしました:

#extension GL_NV_shader_buffer_load : enable
uniform GLfloat* points;

コードから次のように呼び出します。

glUniform1fv(points, pointsLen*4, points);

float を 1 つのグループで渡していると考えており、vec4 の数が 4 倍になっています。
残念ながら、この vshader はコンパイルを GLSL プログラムに渡しません。

これを修正するにはどうすればよいですか? これを修正するか、まったく別の方法で実行してください:)

4

1 に答える 1

1

NVIDIA の shader_buffer_load はそのようには機能しません。ポインターを宣言するuniformということは、そのポインターのデータが格納される GPU アドレスを提供することをコンパイラーに伝えることを意味します。その GPU アドレスは、バッファ オブジェクトから取得されます。

そのため、データをバッファ オブジェクトに入れて常駐にする必要があります (GPU アドレスを取得できるようにするため)。データの配列への CPU ポインターを渡さないでください。

データの配列だけが必要な場合は、shader_buffer_load はまったく必要ありません。GLSL では均一な配列が可能です。それらに明示的なサイズを設定するだけです。

于 2012-01-19T23:14:00.647 に答える