如何在OpenGL ES 2.0顶点着色器程序中查找所有的uniform变量列表

13

我正在尝试学习如何编写顶点着色器。在苹果的示例项目中,他们有一行代码用于设置一个

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

我无法找到所有uniform变量的列表。

有人知道在哪里可以找到所有uniform变量的列表以及学习编写顶点着色器的好书或教程吗?

3个回答

28

Uniform参数是传递给GL着色器的数据,在绘制调用期间不会更改。

您可以使用以下代码查询链接的GLSL程序中活动uniform的列表:

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

这段代码获取活动uniform的数量并迭代遍历它们,提取名称、类型、值的数量和uniform位置。


glGetActiveUniform()size 参数是什么?在这里 glGetActiveUniform 上说 返回 uniform 变量的大小。这里的大小是指变量的维度还是字节数? - Ramiro Magno

1
除了kvark的回答外,您可以添加以下代码行以获得最常见uniforms的漂亮且易读的格式:
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;  

0

我认为在那个示例代码中,UNIFORM_TRANSLATE被定义为0,然后有这样的代码:

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

所以所有的uniform都是通过它们的名称来检索的——在这种情况下是“position”。


谢谢,我进行了搜索并找到了uniforms [UNIFORM_TRANSLATE] = glGetUniformLocation(programId, "position"); - Ted pottel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接