Как создать простой 2d флэш-взрыв в spritekit

#opengl #sprite-kit #shader #sprite #game-development

Вопрос:

Я бы хотел добиться чего-то подобного эффекта

https://www.youtube.com/watch?v=1e2a9-OKXmI (0:27) Это похоже на двойной круг, который вырастает и взрывается, но он имеет некоторые неправильные формы и выглядит очень органично

Я считаю, что использование таблицы спрайтов на самом деле не лучшая идея, так что, может быть, шейдер??

Каков был бы наилучший подход для достижения чего-то подобного?

введите описание изображения здесь

Редактировать:

Этот код в шейдерной https://www.shadertoy.com/view/3dcfWj выглядит очень похоже на то, что я ищу

 #define SPEED 0.5
#define OUTER_ACCEL 1.0
#define INNER_ACCEL 2.0
#define COLOR vec3(1.0, 1.0, 1.0)

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 p = (2.0*fragCoord.xy - iResolution.xy) / min(iResolution.x, iResolution.y);
    float r = length(p);
    float t = mod(iTime * SPEED, 1.0);
    float r2 = pow(t, OUTER_ACCEL);
    float r1 = pow(t, INNER_ACCEL);
    float region = smoothstep(r1-0.01, r1, r) - smoothstep(r2-0.01, r2, r); 
    fragColor = vec4(region * COLOR, 1.0);
}
 

Который портирован на шейдер spritekit

 void main(){
    
    float SPEED         = 0.5;
    float OUTER_ACCEL   = 1.0;
    float INNER_ACCEL   = 2.0;
    vec3 COLOR          = vec3(1.0, 1.0, 1.0);
    
    vec2 p   = (2.0*gl_FragCoord.xy - u_sprite_size.xy) / min(u_sprite_size.x, u_sprite_size.y);
    float r  = length(p);
    float t  = mod(u_time * SPEED, 1.0);
    float r2 = pow(t, OUTER_ACCEL);
    float r1 = pow(t, INNER_ACCEL);
    float region = smoothstep(r1-0.01, r1, r) - smoothstep(r2-0.01, r2, r);
    gl_FragColor = vec4(region * COLOR, 1.0);
}
 -------------

    let s = SKSpriteNode(color: .red, size: CGSize(width: 400, height: 400))
    addChild(s)
    s.shader = SKShader(fileNamed: "CartoonExplosion.fsh")
    
    let spriteSize = vector_float2(Float(s.frame.size.width),
                                   Float(s.frame.size.height))
    
    s.shader?.uniforms = [
        SKUniform(name: "u_sprite_size", vectorFloat2: spriteSize),
        SKUniform(name: "u_speed", float: 0)
    ]
 

Но показывает только черный квадрат

Правка 2 Мне удалось заставить его работать, но ему не хватает той жизни, которая есть у другого, похоже, он более динамичен

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

1. Взгляните на это. gameartpartners.com/game-art-fx