2016-12-28 3 views
1

У меня есть эта функция:glGetProgramIv() не изменяет указатель посланный на него

void GetAllUniforms(unsigned int prog) { 
    int total = -1; 
    glGetProgramiv(prog, GL_LINK_STATUS, &total); 
    printf("total & prog: %d %d\n", total, prog); 
    for(int i=0; i<total; ++i) { 
    int name_len=-1, num=-1; 
    GLenum type = GL_ZERO; 
    char name[100]; 
    glGetActiveUniform(prog, i, sizeof(name)-1, 
     &name_len, &num, &type, name); 
    name[name_len] = 0; 
    unsigned int location = glGetUniformLocation(prog, name); 
    printf("Name: %s/Number: %d/Location: %d\n", name, num, location); 
    } 
} 

Его цель проста, получить все формы и печатать их, однако, скажем, я запустил эту функцию, право ? Это дало бы мне:

Running newpmo/build/out 
total & prog: -1 1 

Это не ясно, нет никаких активных униформа в моих GLSL шейдеры, это смешно, потому что я есть WorldMatrix умножая вектор положения, чтобы получить gl_Position, и при дальнейшей отладки я обнаружил, что если Я поставил всего на другой номер, скажем, 5, я получаю это:

Running newpmo/build/out 
total & prog: 5 1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 

Это довольно странно, потому что это показывает, что glGetProgramiv на самом деле не влияет на общее в любом случае, даже если я послал ему свой адрес и программа скомпилирована и связана правильно!

Как это возможно?

ответ

3

GL_LINK_STATUS возвращает, была ли программа успешно связана или нет. Поэтому, даже если эта строка работала правильно, результатом является не значение, которое вы должны перебирать. Учитывая то, что вы пытаетесь сделать, значение, которое вы хотите запросить, - GL_ACTIVE_UNIFORMS.

Тем не менее, по вашему принципиальному вопросу. Вы получаете от этого какую-то ошибку OpenGL (BTW: всегда проверяйте ошибки OpenGL). Я знаю, потому что единственная причина, по которой функция не будет устанавливать переменную, - это ошибка. Итак, go fetch the error.

Поскольку это не очевидная ошибка (например, передача неправильного перечисления или что-то еще), то, что, вероятно, происходит, не является чем-то, что видно отсюда. То есть вы не передаете действительную программу этой функции. Вы можете передать объект шейдера вместо объекта программы, или вы можете передать значение, которое вы не получили от glCreateProgram.

+0

Мой плохой fot Gl_Link_Status, я поставил его там, чтобы попробовать отладки, но в итоге я оставил его, он делает. То же самое для glactiveuniiforms ... – Whiteclaws

+0

Я нашел ошибку, чтобы напомнить мне :) – Whiteclaws

Смежные вопросы