Как я могу найти список всех форм в 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);
…
Мне не удалось найти список всех мундиров всех мундиров.
Кто-нибудь знает, где я могу найти список всех мундиров и хорошую книгу или учебное пособие по обучению программированию вершинных шейдеров.
Ответы
Ответ 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");
поэтому все формы получаются по их именам - "позиция" в этом случае.