2

GLSLでユニフォームのサイズをスカラー(またはバイト)で取得する方法がわからないようです。

現在、すべてのシェーダー定数を列挙するときにglGetActiveUniformを呼び出していますが、返されるサイズパラメーターは配列サイズであり、可変サイズではありません。

データサイズを取得する機能はありますか?または、ConstantTypeをそのサイズにマップする関数ですか?

完全を期すために、これが私のコードです。

char ConstantName[ 128 ];
GLint ConstantArraySize;
GLenum ConstantType;
glGetActiveUniform( Program, ConstantIndex, 128, nullptr, &ConstantArraySize, &ConstantType, ConstantName );
4

2 に答える 2

3

GLSLのユニフォームのサイズは、そのユニフォームがユニフォームブロックに格納されている場合にのみ関係します。非ブロックのユニフォームの場合、気にしません。それらをでアップロードしglUniform*、OpenGLに変換を処理させます。

ユニフォームブロックメンバーの場合、基本タイプの各ユニフォームには特定のバイトサイズがあります。個々の整数と浮動小数点数のサイズは32ビットです。これらのタイプのベクトルは、そのサイズ*コンポーネントの数です。行列はもっと複雑です。それらは列/行(選択可能)ベクトルとして保存されます。列/行の間のストライドは、クエリする必要があるものですglGetActiveUniformsiv(「s」に注意してください)。

もちろん、std140レイアウトを使用しない限り、その場合、マトリックスストライドは常に4*基本コンポーネントタイプの数になります。したがって、std140レイアウトではmat4x2、格納されたcolumn-majorはvec2sの4つの列ベクトルを表しますが、個々の列ベクトル間のストライドは2 * sizeof(float)ではなく4 * sizeof(float)です。つまり、2つのフロートに相当するパディングがあります。

要するに、気にする理由はありません。ブロック以外のユニフォームの場合、サイズは関係ありません。ユニフォームブロックユニフォームの場合は、とにかくstd140レイアウトを使用する必要があるため、事前に計算できます。

于 2012-10-16T22:51:19.340 に答える
1

私の知る限り、OpenGLのすべてのデータ型のサイズは標準化されています。floatとintは32ビット、doubleは64です。によって与えられた情報を使用してglGetActiveUniform()、一様変数のサイズを自分で計算できます。あなたのためにそれをするためのGL関数を持つことは不必要でしょう。

于 2012-10-16T22:18:44.903 に答える