Подтвердить что ты не робот

Как я могу найти список всех форм в OpenGL es 2.0 vertex shader pro

Я пытаюсь научиться программировать вершинные шейдеры. В примере с образцом 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);
…

Мне не удалось найти список всех мундиров всех мундиров.

Кто-нибудь знает, где я могу найти список всех мундиров и хорошую книгу или учебное пособие по обучению программированию вершинных шейдеров.

4b9b3361

Ответ 1

Единый параметр - это данные, переданные в 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 );
}

Этот код извлекает несколько активных униформ и выполняет итерацию, извлекает имя, тип, количество значений и равномерные местоположения.

Ответ 2

В дополнение к ответу kvark. Вы можете добавить эти строки кода, чтобы получить хороший и красивый читаемый формат наиболее распространенных форм:

std::cout << "Uniform Info Name: " << name << " Location: " << location << " Type: ";
        if (type == GL_FLOAT_MAT4)
            std::cout << "mat4";
        else if (type == GL_FLOAT_VEC3)
            std::cout << "vec3";
        else if (type == GL_FLOAT_VEC4)
            std::cout << "vec4";
        else if (type == GL_FLOAT)
            std::cout << "float";
        else if (type == GL_INT)
            std::cout << "int";
        else if (type == GL_BOOL)
            std::cout << "bool";
        else if (type == GL_SAMPLER_2D)
            std::cout << "sampler2d";
        else
            std::cout << type;

        std::cout << std::endl;  

Ответ 3

Я думаю, что в этом примере кода UNIFORM_TRANSLATE определяется как 0, а затем код выглядит следующим образом:

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

поэтому все формы получаются по их именам - "позиция" в этом случае.