opengl-es vertex vertex-shader

¿Cómo puedo encontrar una lista de todos los uniformes en OpenGL es 2.0 vertex shader pro



opengl-es vertex-shader (3)

Creo que en ese código de ejemplo, UNIFORM_TRANSLATE se define a 0, y luego hay un código como este:

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

entonces todos los uniformes se recuperan por sus nombres - "posición" en este caso.

Estoy tratando de aprender cómo programar sombreadores de vértices. En el proyecto de ejemplo de Apple, tienen una línea para establecer un

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

Entonces este valor se usa en

// value passt in f // glUniform1f(uniforms[UNIFORM_TRANSLATE](Glfloat)transY); uniform float translate; void main() { gl_Position.y+=sin( translate); …

No pude encontrar una lista de todos los uniformes de todos los uniformes.

¿Alguien sabe dónde puedo encontrar una lista de todos los uniformes y un buen libro o tutorial sobre cómo programar sombreadores de vértices?


El parámetro uniforme es un dato pasado al sombreador GL, que no cambia durante la llamada al sorteo.

Puede consultar un programa GLSL vinculado para obtener una lista de uniformes activos con el siguiente código:

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

Este código recupera una cantidad de uniformes activos y los itera, extrayendo nombre, tipo, número de valores y ubicaciones uniformes.


Además de la respuesta de kvark. Puede agregar estas líneas de código para obtener un formato agradable y hermoso de los uniformes más comunes:

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;