Эффект воды в SpriteKit с использованием размытия и порога

Я пытаюсь создать эффект воды с помощью SpriteKit, аналогичный ответу в этой ссылке. Физика воды

Как мне добавить эффект размытия и какой-то «пороговый» фильтр, чтобы получить такой вид?

Я заставил размытие работать вот так, но не знаю, как добавить «пороговый» фильтр.

override func didMoveToView(view: SKView) {

    let effectNode = SKEffectNode()

    let circleOne = SKSpriteNode(imageNamed: "circle1")
    circleOne.position = CGPointMake(CGRectGetMidX(self.frame) - 20, CGRectGetMidY(self.frame))

    let circleTwo = SKSpriteNode(imageNamed: "circle1")
    circleTwo.position = CGPointMake(CGRectGetMidX(self.frame) + 40, CGRectGetMidY(self.frame))

    effectNode.filter = blur()

    effectNode.addChild(circleOne)
    effectNode.addChild(circleTwo)

    addChild(effectNode)
}

func blur() -> CIFilter {
    let filter = CIFilter(name: "CIGaussianBlur")
    filter!.setDefaults()
    filter!.setValue(NSNumber(float: 10.0), forKey: "inputRadius")
    return filter!
}

Спасибо за помощь!


person cheaze    schedule 17.08.2015    source источник
comment
Посмотри на этот проект. github.com/ymc- thzi / ios8-spritekit-custom-shader / tree / master /   -  person sangony    schedule 18.08.2015
comment
Никто не знает, как вы определяете эффект воды.   -  person El Tomato    schedule 19.08.2015
comment
Вы найдете пороговый фильтр здесь, но я подозреваю, что это не так. что вам понадобится для создания эффекта в предоставленной вами ссылке. Это больше похоже на операцию «максимум в регионе».   -  person 0x141E    schedule 19.08.2015
comment
Эффект, связанный с сообщением, на которое вы ссылаетесь, занимал 10 секунд для рендеринга одного кадра в одной точке. Вы же не ожидаете получить аналогичный эффект при 60FPS с CIFilter поверх на мобильном устройстве, не так ли?   -  person CloakedEddy    schedule 20.08.2015
comment
извините @ElTomato, мне, наверное, следовало упомянуть ссылку, которая была опубликована в ответе. Это должно помочь прояснить ситуацию ... patrickmatte.com/stuff/physicsLiquid   -  person cheaze    schedule 20.08.2015
comment
@CloakedEddy OP имеет в виду другой эффект. См. Комментарий выше. Это определенно выполнимо в Sprite Kit.   -  person 0x141E    schedule 25.08.2015


Ответы (1)


Итак, я нашел этот пороговый фильтр, который, кажется, работает очень хорошо.

void main() {
lowp vec4 color = texture2D(u_texture,v_tex_coord);

if(color.w > 0.1) {
    color = vec4(251.0/255.0, 246.0/255.0, 0.0/255.0, 1.0);
} else {
    color = vec4(0.0, 0.0, 0.0, 0.0);
}

gl_FragColor = color; }

Частота кадров довольно ужасна, когда, к сожалению, я получаю около 30-50 спрайтов, сталкивающихся друг с другом.

Чтобы немного помочь, я избавился от размытия и просто сделал размытые изображения спрайтов, но это не сильно помогло.

Я немного прочитал о реализации SpriteKit Box2d. , и, к сожалению, он кажется не очень эффективным, поэтому я могу застрять на нем.

Если у кого-то есть лучшее решение, я хотел бы услышать ваши мысли!

Вот как это выглядело на данный момент.

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

person cheaze    schedule 26.08.2015