在 SKShader 中使用父坐标

Posted

技术标签:

【中文标题】在 SKShader 中使用父坐标【英文标题】:Use parent coordinates in SKShader 【发布时间】:2016-04-19 20:11:33 【问题描述】:

我正在使用 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。

问题在于精灵是可以移动的 SKNode 的子节点。由于 gl_FragCoord 位于屏幕坐标中,因此移动会影响动画。

问:有什么方法可以避免精灵着色器受到父节点移动的影响,而无需将包含精灵的位置和 zRotation 的统一数据传递给着色器?

【问题讨论】:

【参考方案1】:

是的,而不是更改统一(这将重新编译着色器),将大小作为 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")

【讨论】:

以上是关于在 SKShader 中使用父坐标的主要内容,如果未能解决你的问题,请参考以下文章

知识点3 shader_基础纹理

关于Unity中Shader的使用

Shader笔记——3D数学基础

Unity Shader入门精要学习笔记 - 第7章 基础纹理

Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

SpriteKit问题与Swift中的SKShader动画