How to use the uniform block array?

hello everybody.i have some trouble in useing glsl uniform block array.how to pass data to the uniform block array elements?
code as following:


//vertex shader
#version 330
uniform Light
{
    vec4 pos;
    vec4 direction;
    vec4 color;
    float shi;
}light[3];
void main()
{
    gl_Position=vec4(1.0,0.0,0.0,1.0);
    float a=light[0].pos.x+light[0].direction.y+light[0].color.z+light[0].shi;
          a+=light[1].pos.x+light[1].direction.y+light[1].color.z+light[1].shi;
          a+=light[2].pos.x+light[2].direction.y+light[2].color.z+light[2].shi;
    gl_Position.x=a;
}

//fragment shader
#version 330
out vec4 outputColor;
void main()
{
    outputColor=vec4(1.0,0.0,0.0,1.0);
}


    int progid=LoadShaders("tstvert.vert.txt","tstvert.frag.txt");
    GLuint L0;
    GLint Ls0;
    L0=glGetUniformBlockIndex(progid,"Light[0]");
    glGetActiveUniformBlockiv(progid,L0,GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS,&Ls0);
    GLuint L1;
    GLint Ls1;
    L1=glGetUniformBlockIndex(progid,"Light[1]");
    glGetActiveUniformBlockiv(progid,L1,GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS,&Ls1);

    GLuint L2;
    GLint Ls2;
    GLint indexs2[4];
    L2=glGetUniformBlockIndex(progid,"Light[2]");
    glGetActiveUniformBlockiv(progid,L2,GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS,&Ls2);
    glGetActiveUniformBlockiv(progid,L2,GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,indexs2);

    std::vector<std::string> myv;
    GLint len;
    GLenum tp;
    GLchar nam[128];
    GLint siz;
    for (int i=0;i<Ls2;i++)
    {
        glGetActiveUniform(progid,indexs2[i],128,&len,&siz,&tp,nam);
        myv.push_back(std::string(nam));
    }

why the L0,L1 block index’s active uniform block number is 0?and the L2 is 4.
i query the block index L2 uniform name,they are “Light.pos,Light.color …”, why not “Light[2].pos,Light[2].color …”?

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.