。
シェーダのコンパイル後にサイズを変更することができないため、最適な方法は、その長さを別の場所に保存することです。
配列の長さを取得する簡単な方法はありません。配列自体は存在しないためです。コンパイルすると、配列の各要素(および構造体の各要素)は、それぞれ独自の統一になります。行うことの必要性によって明らかである:
glGetUniformLocation(program, "spheres[4].position")
事はあなたのシェーダがだけにしてspheres[4].position
とspheres[8].position
を使用している場合、他の全てのspheres[x].position
が存在しません離れため、最適化される可能性が高いということです。
どのようにして均一な配列の長さが得られますか?
glGetActiveUniform()
と正規表現またはsscanf()
を使用してこれを達成できます。そして、あなたが行うことができ、あなたが提供されていますどのように多くのspheres[x].position
チェックしたいと言う:
GLint count;
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count);
const GLsizei NAME_MAX_LENGTH = 64
GLint location, size;
GLenum type;
GLchar name[NAME_MAX_LENGTH];
GLsizei nameLength;
int index, charsRead;
for (GLint i = 0; i < count; ++i)
{
glGetActiveUniform(program, (GLuint)i, NAME_MAX_LENGTH, &nameLength, &size, &type, name);
if (sscanf(name, "spheres[%d].position%n", &index, &charsRead) && (charsRead == nameLength))
{
// Now we know spheres[index].position is available
}
}
あなたはさらにそれがどのデータタイプを把握するGL_FLOAT
またはGL_FLOAT_VEC3
にtype
を比較することができます。
int count
を追加し、一致するたびに増分すると覚えておいてください。たとえ最後にcount
が3
であっても。それは要素0, 1, 2
が利用可能であるということを意味しません。それは容易に要素0, 5, 8
であることができます。
その他の注意事項:
name
がNULL終端文字列
%n
では、文字の数はこれまでのところ、この大きな説明のための
感謝を読んだが、私の質問は、サイズを取得する方法ですそれがユーザー定義の型を持っているならば、それはその名前で統一された変数を返します。申し訳ありませんが、私は最も難しい場合を示すためにそこに配列を追加しましたが、それは私の疑問を不明瞭にしました。したがって、ここではより簡単な統一宣言があります:「均一な球体」と、私のC++コードから「球体」のサイズを取得したいのです。 –
私の答えはすでにそれをカバー? 'type'を使用してください。というのは、それ自体には球体[i]がないので、sizeof(球体[i])は存在しないということです。個々の要素のみがそれぞれユニフォームにマップされます。だからあなたはすべての球[i]を調べなければなりません。その後、そのタイプをチェックして、最終的なサイズを確定することができます。したがって、配列の最終サイズをチェックしたい場合、すべての 'sphere。*'をチェックする必要があります。 – Vallentin