我正在尝试学习如何编写顶点着色器。在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);
…
我无法找到所有制服的所有制服清单。
有没有人知道我在哪里可以找到所有制服的清单,还有一本关于学习如何编写顶点着色器的好书或教程。
答案 0 :(得分:26)
Uniform参数是传递给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 :(得分:1)
除了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;
答案 2 :(得分:0)
我认为在该示例代码中,UNIFORM_TRANSLATE定义为0,然后是这样的代码:
uniforms [UNIFORM_TRANSLATE] = glGetUniformLocation (programId, "position");
所以所有的制服都是按照他们的名字检索的 - 在这种情况下是“位置”。