Search code examples
initializationglslshaderpyglet

pyglet gives error regarding GLSL version


I am trying to run a code that has a GUI built with pyglet. but it gives this error. I have searched and found that I need to directly set the version of GLSL to be used by the code but I don't know how. would be happy if you helped me out with it.

b"0:20(27): error: cannot initialize uniform weight in GLSL 1.10 (GLSL 1.20 required)\n0:20(27): error: array constructors forbidden in GLSL 1.10 (GLSL 1.20 or GLSL ES 3.00 required)\n0:20(27): error: initializer of uniform variable `weight' must be a constant expression\n0:79(17): error: could not implicitly convert operands to arithmetic operator\n0:79(16): error: operands to arithmetic operators must be numeric\n0:89(7): warning: `coeff' used uninitialized\n"

this is the shader.py file:

Update

added the glsl file with the uniform weight in it

#ifdef GL_ES
precision highp float;
#endif

uniform sampler2D inlet;
uniform sampler2D disp0;
uniform float sigma;

uniform bool xmirror;

uniform vec3 colors[9];
uniform float streams[9];


/*mat4 gaussm = mat4(0.00000067, 0.00002292, 0.00019117, 0.00038771,
                     0.00002292, 0.00078634, 0.00655965, 0.01330373,
                     0.00019117, 0.00655965, 0.05472157, 0.11098164,
                     0.00038771, 0.01330373, 0.11098164, 0.22508352);*/
                     
uniform float weight[5] = float[](0.2270270270, 0.1945946, 0.1216216216, 0.0540540541, 0.0162162162);


vec4 sample(vec2 p)
{
    vec4 col;
    if(streams[0] >= 0.)
    {

        int stream = 0;
        for(int i=0;streams[stream] <  min(p.x, 1.) && stream < 8;stream++) { }
        col = vec4(colors[stream], 1.);

    }
    else {
        col = texture2D(inlet, p);
    }
    return col;
}

float gaussian(float d, float s)
{
    float pi = 3.141592653;
    //return exp(- d*d / (4.0 * pi * s * s));
    //return pow(4*pi*s*s, 0.5)*exp(- d*d / (4.0 * pi * s * s));
    return exp(- d*d / (2.*s*s));
}

float gaussian2(float d, float s)
{
    float pi = 3.141592653;
    float c = pow(1.0 / (4.0 * pi * s), 0.5);
    float e = -1.0*(d * d) / (4.0 * s);
    return c * exp(e);
}

float gaussf(int i, int j,float nf, float s)
{
    //return gaussm[i][j];
    float fi = float(i)/nf;
    float jf = float(j)/nf;
    return gaussian2(sqrt(fi*fi+jf*jf), s);
}

float cosh(float x)
{
    return (exp(x)+exp(-x))/2.;
}

float rect_calc(vec2 d)
{
    float pi = 3.141592653;
    float AR = 0.25;
    float offset = 0.125;
    float m = 155.;
    float n = 155.;

    vec3 xyz = vec3(0., (d.x/1.), (d.y/8. + offset));
    float u = 0.;
    float coeff = (16 * pow(AR, 2.)) / pow(pi, 4.);
    float num;
    float den;
    for(float i = 1.; i <= n; i += 2.)
    {
        for(float j = 1.; j <= m; j += 2.)
        {
            num = sin(i * pi * xyz.y) * sin(j * pi * ((xyz.z)/AR));
            den = i * j * (pow(AR, 2.) * pow(AR, 2.) + pow(j, 2.));

            u += coeff * (num / den);
        }
    }

    // Convert velocity to time-of-flight
    float L = 2.0;
    float u_mean = 0.0043;
    float u_norm = u/u_mean;
    return L / u_norm;
}

void main()
{
    vec2 uv = gl_TexCoord[0].st;
    if(xmirror)
    {
       uv.x = 1.-uv.x;
    }
    vec2 d = texture2D(disp0, uv).yz * vec2(1.,8.);
    if(xmirror)
    {
        d.x = -d.x;
       uv.x = 1.-uv.x;
    }
    vec2 p = uv + d;

    if(sigma <= 0.)
    {
        gl_FragColor = sample(p);
    } else {
        //Sample
        vec4 c = vec4(0.);
        float Dt = sigma*rect_calc(uv.xy);
        float s = pow(Dt, 0.5);
        float s2 = 1.0; 
        float t = 0.;
        int ni = 8;
        float n = 8.;
       
        for(int ii = 0; ii < ni-1; ii++)
        {
            float i = float(ii);

            for(int jj = 0; jj < ni-1; jj++)
            {
                float j = float(jj);
                t += gaussf(ii,jj,n-1.,s2)*4.;
                c += gaussf(ii,jj,n-1.,s2) * (sample(p + vec2((n-1.-i)*s, (n-1.-j)*s)) + sample(p + vec2(-(n-1.-i)*s, (n-1.-j)*s)) + sample(p + vec2(-(n-1.-i)*s, -(n-1.-j)*s)) + sample(p + vec2((n-1.-i)*s, -(n-1.-j)*s)));
            }

            t += gaussf(ii,ni-1,n-1.,s2)*4.;
            c += gaussf(ii,ni-1,n-1.,s2) * (sample(p + vec2((n-1.-i)*s, 0.)) + sample(p + vec2(-(n-1.-i)*s, 0.))+ sample(p + vec2(0., (n-1.-i)*s))+ sample(p + vec2(0., -(n-1.-i)*s)));
        }

        t += gaussf(ni-1,ni-1,n-1.,s2);
        c += gaussf(ni-1,ni-1,n-1.,s2) * sample(p);
        
        
        //gl_FragColor = c;
        gl_FragColor = c/t;        
        //gl_FragColor = (sigma*rect_calcu(uv.xy))*c/t;
    }
}

Solution

  • well it got solved! just needed to add the directive #version 120 at the beginning of the shader like this:

    #version 120
    #ifdef GL_ES
    precision highp float;
    #endif
    
    uniform sampler2D inlet;
    uniform sampler2D disp0;
    uniform float sigma;
    
    uniform bool xmirror;
    
    uniform vec3 colors[9];
    uniform float streams[9];
    
    
    /*mat4 gaussm = mat4(0.00000067, 0.00002292, 0.00019117, 0.00038771,
                         0.00002292, 0.00078634, 0.00655965, 0.01330373,
                         0.00019117, 0.00655965, 0.05472157, 0.11098164,
                         0.00038771, 0.01330373, 0.11098164, 0.22508352);*/
                         
    uniform float weight[5] = float[](0.2270270270, 0.1945946, 0.1216216216, 0.0540540541, 0.0162162162);
    
    
    vec4 sample(vec2 p)
    {
        vec4 col;
        if(streams[0] >= 0.)
        {
    
            int stream = 0;
            for(int i=0;streams[stream] <  min(p.x, 1.) && stream < 8;stream++) { }
            col = vec4(colors[stream], 1.);
    
        }
        else {
            col = texture2D(inlet, p);
        }
        return col;
    }
    
    float gaussian(float d, float s)
    {
        float pi = 3.141592653;
        //return exp(- d*d / (4.0 * pi * s * s));
        //return pow(4*pi*s*s, 0.5)*exp(- d*d / (4.0 * pi * s * s));
        return exp(- d*d / (2.*s*s));
    }
    
    float gaussian2(float d, float s)
    {
        float pi = 3.141592653;
        float c = pow(1.0 / (4.0 * pi * s), 0.5);
        float e = -1.0*(d * d) / (4.0 * s);
        return c * exp(e);
    }
    
    float gaussf(int i, int j,float nf, float s)
    {
        //return gaussm[i][j];
        float fi = float(i)/nf;
        float jf = float(j)/nf;
        return gaussian2(sqrt(fi*fi+jf*jf), s);
    }
    
    float cosh(float x)
    {
        return (exp(x)+exp(-x))/2.;
    }
    
    float rect_calc(vec2 d)
    {
        float pi = 3.141592653;
        float AR = 0.25;
        float offset = 0.125;
        float m = 155.;
        float n = 155.;
    
        vec3 xyz = vec3(0., (d.x/1.), (d.y/8. + offset));
        float u = 0.;
        float coeff = (16 * pow(AR, 2.)) / pow(pi, 4.);
        float num;
        float den;
        for(float i = 1.; i <= n; i += 2.)
        {
            for(float j = 1.; j <= m; j += 2.)
            {
                num = sin(i * pi * xyz.y) * sin(j * pi * ((xyz.z)/AR));
                den = i * j * (pow(AR, 2.) * pow(AR, 2.) + pow(j, 2.));
    
                u += coeff * (num / den);
            }
        }
    
        // Convert velocity to time-of-flight
        float L = 2.0;
        float u_mean = 0.0043;
        float u_norm = u/u_mean;
        return L / u_norm;
    }
    
    void main()
    {
        vec2 uv = gl_TexCoord[0].st;
        if(xmirror)
        {
           uv.x = 1.-uv.x;
        }
        vec2 d = texture2D(disp0, uv).yz * vec2(1.,8.);
        if(xmirror)
        {
            d.x = -d.x;
           uv.x = 1.-uv.x;
        }
        vec2 p = uv + d;
    
        if(sigma <= 0.)
        {
            gl_FragColor = sample(p);
        } else {
            //Sample
            vec4 c = vec4(0.);
            float Dt = sigma*rect_calc(uv.xy);
            float s = pow(Dt, 0.5);
            float s2 = 1.0; 
            float t = 0.;
            int ni = 8;
            float n = 8.;
           
            for(int ii = 0; ii < ni-1; ii++)
            {
                float i = float(ii);
    
                for(int jj = 0; jj < ni-1; jj++)
                {
                    float j = float(jj);
                    t += gaussf(ii,jj,n-1.,s2)*4.;
                    c += gaussf(ii,jj,n-1.,s2) * (sample(p + vec2((n-1.-i)*s, (n-1.-j)*s)) + sample(p + vec2(-(n-1.-i)*s, (n-1.-j)*s)) + sample(p + vec2(-(n-1.-i)*s, -(n-1.-j)*s)) + sample(p + vec2((n-1.-i)*s, -(n-1.-j)*s)));
                }
    
                t += gaussf(ii,ni-1,n-1.,s2)*4.;
                c += gaussf(ii,ni-1,n-1.,s2) * (sample(p + vec2((n-1.-i)*s, 0.)) + sample(p + vec2(-(n-1.-i)*s, 0.))+ sample(p + vec2(0., (n-1.-i)*s))+ sample(p + vec2(0., -(n-1.-i)*s)));
            }
    
            t += gaussf(ni-1,ni-1,n-1.,s2);
            c += gaussf(ni-1,ni-1,n-1.,s2) * sample(p);
            
            
            //gl_FragColor = c;
            gl_FragColor = c/t;        
            //gl_FragColor = (sigma*rect_calcu(uv.xy))*c/t;
        }
    }