2017-02-08 12 views
2

Я пытаюсь понять, как применять шейдер в SpriteKit, так что я сделал следующий шейдер, который исходит от руководства с некоторыми изменениями (http://battleofbrothers.com/sirryan/understanding-shaders-in-spritekit):Shader не лежит на верхней части моего спрайта

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

    if (val.a == 1.0) { 
     gl_FragColor = vec4(1.0,1.0,1.0,1.0); 
    } else { 
     gl_FragColor = val; 
    } 
} 

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

Шейдер работает с моими вершинами спрайтов, которые имеют единую текстуру как свое изображение.

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

Любые предложения?

+0

К сожалению, у меня не хватает какой-то понимание. Что вы подразумеваете под «многослойным SKScene»? – Confused

+0

Привет, спасибо вам за вашу поддержку. Я нашел решение своей проблемы (которую я опубликую в ближайшее время). Во всяком случае, по «многослойной SKScene» я имею в виду, что я создал файл сценария визуальной сцены (.sks), и я построил свой спрайт внутри этой сцены, добавив разные узлы для различных частей тела, так что легко оживить спрайт с некоторыми SKActions. – gionti

ответ

1

Я нашел обходной путь к моей проблеме.

Первоначально я пытался применить шейдер к каждому узлу детей моего спрайта следующим образом:

for child in children { 
    (child as! SKSpriteNode).shader = myShader 
} 

код не сработает.

Теперь я использую следующий рабочий код, который следует иерархии моих дочерних узлов:

(self.childNode(withName: "body") as! SKSpriteNode).shader = myShader 
(self.childNode(withName: "body")!.childNode(withName: "arm") as! SKSpriteNode).shader = myShader 
// ...