2016-04-19 4 views
1

Ich spiele mit SKShader für iOS.Verwenden Sie übergeordnete Koordinaten in SKShader

void main() { 
    vec4 val = texture2D(u_texture, v_tex_coord); 
    float len = 0.5 + 0.5 * sin(10.0 * u_time + 0.05 * (gl_FragCoord.x + gl_FragCoord.y)); 
    vec4 c = vec4(vec3(len), 1); 
    gl_FragColor = c * val; 
} 

Ich möchte diesen Shader Sprites zuweisen, die verbunden sind, und ich möchte, dass die Wirkung zwischen den Sprites glatt sein. Daher glaube ich nicht, dass ich v_tex_coord im Shader verwenden kann. Ich benutze stattdessen gl_FragCoord.

Das Problem ist, dass die Sprites Kinder eines SKNode sind, die verschoben werden können. Und da sich gl_FragCoord in Bildschirmkoordinaten befindet, beeinflusst diese Bewegung die Animation.

F: Gibt es eine Möglichkeit zu vermeiden, dass die Sprite-Shader von einer Bewegung des Elternknotens betroffen sind, ohne einheitliche Daten, die die Position und die zRotation des Sprites enthalten, an den Shader weiterzuleiten?

Antwort

0

Ja, anstatt eine einheitliche Veränderung (die den Shader neu kompilieren), die Größe als SKAttribute geben und das Attribut in Ihrem SKSceneDelegateupdate Methode aktualisieren.

Zum Beispiel:

let attributeBasedShader = SKShader(fileNamed: "UsingAttributes.fsh") 
attributeBasedShader.attributes = [ 
    SKAttribute(name: "a_sprite_position", type: .vectorFloat2)] 

let sprite = SKSpriteNode() 
sprite.shader = attributeBasedShader 


let spritePosition = vector_float2(Float(sprite.position.x), 
            Float(sprite.position.y)) 
sprite.setValue(SKAttributeValue(vectorFloat2: spritePosition), 
       forAttribute: "a_sprite_position")