13

頂点シェーダーをプログラムする方法を学ぼうとしています。Apple のサンプル プロジェクトでは、

glUniform1f(uniforms[UNIFORM_TRANSLATE], (Glfloat)transY);

次に、この値が使用されます

// value passt in f
// glUniform1f(uniforms[UNIFORM_TRANSLATE](Glfloat)transY);
uniform float translate;

void main()
{
    gl_Position.y+=sin( translate);
…

すべてのユニフォームのすべてのユニフォームのリストを見つけることができませんでした。

すべてのユニフォームのリストと、頂点シェーダーのプログラミング方法を学習するための優れた本またはチュートリアルがどこにあるか知っている人はいますか?

4

3 に答える 3

28

Uniform パラメータは、GL シェーダに渡されるデータであり、描画呼び出し中に変更されません。

次のコードを使用して、リンクされた GLSL プログラムにクエリを実行し、アクティブなユニフォームのリストを取得できます。

int total = -1;
glGetProgramiv( program_id, GL_ACTIVE_UNIFORMS, &total ); 
for(int i=0; i<total; ++i)  {
    int name_len=-1, num=-1;
    GLenum type = GL_ZERO;
    char name[100];
    glGetActiveUniform( program_id, GLuint(i), sizeof(name)-1,
        &name_len, &num, &type, name );
    name[name_len] = 0;
    GLuint location = glGetUniformLocation( program_id, name );
}

このコードは、多数のアクティブなユニフォームを取得して反復処理し、名前、タイプ、値の数、およびユニフォームの場所を抽出します。

于 2011-02-11T15:17:50.610 に答える
0

そのサンプル コードでは、UNIFORM_TRANSLATE が 0 に定義されており、次のようなコードがあると思います。

uniforms [UNIFORM_TRANSLATE] = glGetUniformLocation (programId, "position");

そのため、すべてのユニフォームは名前 (この場合は「位置」) で取得されます。

于 2011-01-24T15:51:52.877 に答える