I fiddled around with the test and I was able to use varying vec4
var_in[13] as a max in one array. 14 - 16 resulted in a segmentation
fault and 17 resulted in glLinK failure error.
I was able to create a second array of varying vec4 testa[3] though
and it compiled successfully resulting in 64 varyings. I'll attach what I
did.
#include <GL/gl.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
void init(void)
{
GLuint shader = glCreateShader(GL_FRAGMENT_SHADER), shader2 = glCreateShader(GL_VERTEX_SHADER);
GLuint prog;
char log[4096];
GLsizei len;
const char *code =
"varying vec4 var_in[13];"
//"varying vec4 gl_Color;"
//"varying vec4 gl_SecondaryColor;"
//"varying vec4 gl_TexCoord[];"
"varying vec4 testa[3];" // second array
"int counter;"
"int countera;" // for second for loop
"uniform ivec4 controla;" // for second for loop
"uniform ivec4 control;"
/*"const ivec4 control = ivec4(0, 5, 1, 0);" */
"void main() {"
" gl_FragColor = vec4(0.0);"
" for(counter = control.y; counter < control.x; counter+control.z) {"
/*" gl_FragColor += gl_TexCoord[counter + 0];" -- resulted in mismatch semantics */
" gl_FragColor += var_in[counter + 0];"
//" gl_Color;"
//" gl_SecondaryColor;"
//" gl_TexCoord[0];"
//" gl_FogFragCoord;"
" }"
" for(countera = controla.y; countera < controla.x; countera+controla.z) {"
" gl_FragColor += testa[countera + 0];"
" }"
"}";
const char *codev =
"varying vec4 var_in[13];"
"uniform vec4 param[16];"
//"varying vec4 gl_FrontColor;"
//"varying vec4 gl_BackColor;"
//"varying vec4 gl_FrontSecondaryColor;"
//"varying vec4 gl_BackSecondaryColor;"
//"varying vec4 gl_TexCoord[];"
"varying vec4 testa[3];" // second array
"void main() {"
" var_in[0] = param[0];"
" var_in[1] = param[1];"
" var_in[2] = param[2];"
" var_in[3] = param[3];"
" var_in[4] = param[4];"
" var_in[5] = param[5];"
" var_in[6] = param[6];"
" var_in[7] = param[7];"
" var_in[8] = param[8];"
" var_in[9] = param[9];"
" var_in[10] = param[10];"
" var_in[11] = param[11];"
" var_in[12] = param[12];"
" testa[0] = param[13];"
" testa[1] = param[14];"
" testa[2] = param[15];"
//" gl_FrontColor = param[13];"
//" gl_BackColor = param[14];"
//" gl_FrontSecondaryColor = param[15];"
//" gl_BackSecondaryColor = param[16];"
//" gl_TexCoord[0];"
//" gl_FogFragCoord = float(0.0);"
" gl_Position = vec4(0.0);"
"}";
glShaderSource(shader, 1, &code, 0);
glCompileShader(shader);
glGetShaderInfoLog(shader, sizeof(log), &len, log);
printf("%s\n", log);
glShaderSource(shader2, 1, &codev, 0);
glCompileShader(shader2); // changed from shader to shader2
glGetShaderInfoLog(shader2, sizeof(log), &len, log); // same here
printf("%s\n", log);
prog = glCreateProgram();
glAttachShader(prog, shader);
glAttachShader(prog, shader2);
glLinkProgram(prog);
glGetInfoLogARB(prog, sizeof(log), NULL, log);
printf("link:\n");
printf("%s\n", log);
printf("end link:\n");
printf("error: %d\n", glGetError());
return;
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (200, 200);
glutCreateWindow (argv[0]);
init();
return 0;
}