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