>>175426
Давай помогу разобраться?
Фрагментный шейдер выполняется для каждой точки на экране и не зависит от соседних. Простой пример, рисующий красный круг на белом фоне:
void mainImage(out vec4 Output, vec2 U)
{
vec2 v = U / iResolution.xy; //normalized texture coordinates
v = v * 2.0 - 1.0; //[0,1] => [-1,1]
v.x *= iResolution.x / iResolution.y; //aspect ratio applied on x coordinate
float c = v.x * v.x + v.y * v.y - 0.5; //circle
//float c = dot(v, v) - 0.5; //same as above but with dot product
Output = c < 0.0 ? vec4(1.0,0.0,0.0,1.0) : vec4(1.0);
}
Код гироида с шейдертоя в менее оптимальную и более понятную форму:
void mainImage(out vec4 O, vec2 U)
{
//mat2 R = mat2( sin(iTime+vec4(0,33,11,0))); // uncomment to add rotation
vec2 tc = U / iResolution.xy; //normalized tc [0-1]
vec2 n = tc * 2.0 - 1.0; //[0-1] => [-1,1]
vec3 D = vec3(n, -1.0); // ray direction
D.x *= iResolution.x / iResolution.y; //aspect ratio applied on x coordinate
D.xy *= 0.3; // 1.0 / scale
vec3 p = 30./iResolution, a; // marching point along ray
float v = 0.0;
for (O=vec4(1.0); O.x > 0.0; O-=.015 )
{
vec3 q = p;
//q.xz *= R, q.yz *= R; // uncomment to add rotation
v = dot(sin(q),cos(q.yzx)); //gyroid equation
float d = abs(v); //draw back faces too (v < 0)
//d -= 0.1; //uncomment to add thickness
//clamp to cube
a = abs(q);
d = max(d, max(a.x,max(a.y,a.z))-6.);
if (d < 0.1)
break;
p += .5*d*D; // step forward = dist to obj
}
//colorize, front (v > 0) and back (v < 0)
O *= v > 0.0 ? vec4(1,.8,.8,1) : vec4(.8,.8,1,1);
}
У себя в коде тебе надо будет отрисовать full screen quad с чем-то вроде этого во фрагментном шейдере:
uniform float iTime;
uniform vec2 iResolution;
varying vec2 tc;
void mainImage(out vec4 O, vec2 U)
{
...
}
void main()
{
vec4 color;
mainImage(out color, tc * iResolution);
gl_FragColor = color;
}