2011-01-24 7 views
12

Sto cercando di imparare come programmare vertex shader. Nel progetto di esempio di Apple hanno una linea per impostare unCome posso trovare un elenco di tutte le uniformi in OpenGL es 2.0 vertex shader pro

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

Allora questo valore viene utilizzato in

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

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

non sono riuscito a trovare un elenco di tutte le uniformi di tutte le divise.

Qualcuno sa dove posso trovare un elenco di tutte le uniformi e un buon libro o tutorial su come imparare a programmare i vertex shader.

risposta

0

Penso che in quel codice di esempio, UNIFORM_TRANSLATE è definito a 0, e poi c'è il codice come questo:

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

così tutte le divise vengono recuperati con i loro nomi - "posizione" in questo caso.

+0

Grazie, ho fatto un sercah e ha trovato uniformi [UNIFORM_TRANSLATE] = glGetUniformLocation (programId, "posizione") ; –

26

Un parametro univoco è un dato passato a GL shader, che non cambia durante la chiamata di estrazione.

è possibile interrogare un programma GLSL collegato per un elenco di uniformi attivi con il seguente codice:

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); 
} 

Questo codice recupera una serie di uniformi attivi e itera però loro, estrazione nome, tipo, numero di valori e posizioni uniformi.

1

In aggiunta alla risposta di kvark. È possibile aggiungere queste righe di codice per ottenere un bel e bella formato leggibile delle divise più comuni:

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;