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 …”?