在SKShader中使用父坐标

时间:2016-04-19 20:11:34

标签: ios opengl-es sprite-kit

我正在玩SKShader for iOS。

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;
}

我想将这个着色器分配给连接的精灵,我希望精灵之间的效果平滑。因此,我不认为我可以在着色器中使用v_tex_coord。我改用gl_FragCoord。

问题是sprite是可以移动的SKNode的子代。由于gl_FragCoord位于屏幕坐标中,因此移动会影响动画。

问:有没有办法避免精灵着色器受到父节点移动的影响而不将包含精灵的位置和zRotation的统一数据传递给着色器?

1 个答案:

答案 0 :(得分:0)

是的,而不是更改制服(将重新编译着色器),将大小作为SKAttribute传递,并使用SKSceneDelegate update方法更新属性。

例如:

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")