Как оптимизируется фрагментный шейдер на iphone? - PullRequest
0 голосов
/ 10 января 2020

Я хочу портировать пример с Shadertoy на iPhone с помощью GLKit ( Здесь ). Однако эффект не очень хорош при запуске программы. Эффект рендеринга не является плавным. Даже временной интервал составлял почти четыре секунды. Я подозреваю, что это из-за сложности операции во фрагментном шейдере. Так что мне было интересно, есть ли способ рендеринга без застревания, спасибо.

фрагментный шейдер:

precision highp float;
varying highp vec2 TextureCoordsVarying;
uniform vec2 SceneSize;
uniform float elapsedTime;

#define TAU 6.2831852
#define MOD3 vec3(.1031,.11369,.13787)
#define BLACK_COL vec3(16,21,25)/255.

vec3 hash33(vec3 p3)
{
   p3 = fract(p3 * MOD3);
   p3 += dot(p3, p3.yxz+19.19);
   return -1.0 + 2.0 * fract(vec3((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y, (p3.y+p3.z)*p3.x));
}

float simplex_noise(vec3 p)
{
   const float K1 = 0.333333333;
   const float K2 = 0.166666667;

   vec3 i = floor(p + (p.x + p.y + p.z) * K1);
   vec3 d0 = p - (i - (i.x + i.y + i.z) * K2);

   vec3 e = step(vec3(0.0), d0 - d0.yzx);
   vec3 i1 = e * (1.0 - e.zxy);
   vec3 i2 = 1.0 - e.zxy * (1.0 - e);

   vec3 d1 = d0 - (i1 - 1.0 * K2);
   vec3 d2 = d0 - (i2 - 2.0 * K2);
   vec3 d3 = d0 - (1.0 - 3.0 * K2);

   vec4 h = max(0.6 - vec4(dot(d0, d0), dot(d1, d1), dot(d2, d2), dot(d3, d3)), 0.0);
   vec4 n = h * h * h * h * vec4(dot(d0, hash33(i)), dot(d1, hash33(i + i1)), dot(d2, hash33(i + i2)), dot(d3, hash33(i + 1.0)));

   return dot(vec4(31.316), n);
}


void main() {

   vec2 uv = 2.0 * TextureCoordsVarying.xy - 1.0;
   if (SceneSize.x > SceneSize.y) {
       uv.x *= SceneSize.x/SceneSize.y;
   }else{
       uv.y *= SceneSize.y/SceneSize.x;
   }

   float a = sin(atan(uv.y, uv.x));
   float am = abs(a-.5)/4.;
   float l = length(uv);

   float t = elapsedTime;

   float m1 = clamp(.1/smoothstep(.0, 1.75, l), 0., 1.);
   float m2 = clamp(.1/smoothstep(.42, 0., l), 0., 1.);
   float s1 = (simplex_noise(vec3(uv*2., 1. + t*.525))*(max(1.0 - l*1.75, 0.)) + .9);
   float s2 = (simplex_noise(vec3(uv*1., 15. + t*.525))*(max(.0 + l*1., .025)) + 1.25);
   float s3 = (simplex_noise(vec3(vec2(am, am*100. + t*3.)*.15, 30. + t*.525))*(max(.0 + l*1., .25)) + 1.5);
   s3 *= smoothstep(0.0, .3345, l);

   float sh = smoothstep(0.15, .35, l);

   float m = m1*m1*m2 * ((s1*s2*s3) * (1.-l)) * sh;
   //m = clamp(m, 0., 1.);

   vec3 col = mix(BLACK_COL, (0.5 + 0.5*cos(t+uv.xyx*3.+vec3(0,2,4))), m);

   gl_FragColor = vec4(col, 1.);

}

...