pyglet выдает ошибку относительно версии GLSL

#initialization #glsl #shader #pyglet

Вопрос:

Я пытаюсь запустить код с графическим интерфейсом, построенным с помощью pyglet. но это дает такую ошибку. Я искал и обнаружил, что мне нужно напрямую установить версию 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 expressionn0:79(17): error: could not implicitly convert operands to arithmetic operatorn0:79(16): error: operands to arithmetic operators must be numericn0:89(7): warning: `coeff' used uninitializedn"
 

это тот самый 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.) amp;amp; 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;
    }
}
 

Комментарии:

1. У меня возникли некоторые проблемы с вводом кода. какая-то его часть не распознается как кодовый блок

2. @Rabbid76 ну, я понятия не имею, что это такое. вы имеете в виду gui.py это может быть вызовом shader.py?

3. @Rabbid76 добавил соответствующую функцию, весь код составляет около 600 строк и вызывает другие файлы и прочее, чтобы сообщить, нужно ли это

4. @Rabbid76 только что нашел файлы glsl

5. Это не шейдер, который вызывает проблему, weight в нем нет единообразия.

Ответ №1:

что ж, это было решено! просто нужно было добавить директиву #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.) amp;amp; 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;
    }
}