Как найти список всех униформ в OpenGL es 2.0 vertex shader pro? - PullRequest
12 голосов
/ 24 января 2011

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

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

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

Ответы [ 3 ]

26 голосов
/ 11 февраля 2011

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

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

1 голос
/ 16 июля 2015

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

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;  
0 голосов
/ 24 января 2011

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

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

так что все униформы извлекаются по их именам - в данном случае «позиция».

...