pyglet 给出有关 GLSL 版本的错误

pyglet gives error regarding GLSL version

我正在尝试 运行 具有使用 pyglet 构建的 GUI 的代码。 但它给出了这个错误。我搜索了一下,发现需要直接设置代码使用的GLSL的版本,但是不知道怎么设置。如果你能帮助我,我会很高兴。

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"

这是 shader.py 文件:

更新

添加了统一权重的glsl文件

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

好了,解决了! 只需要在着色器的开头添加指令 #version 120,如下所示:

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