【问题标题】:How do I add an SKSpriteNode with custom SKShader to a scene?如何将带有自定义 SKShader 的 SKSpriteNode 添加到场景中?
【发布时间】:2014-07-31 04:46:42
【问题描述】:

我的着色器完美呈现在 .sks 文件中。问题是将其添加到 SKSpriteNode 或任何其他支持的节点以在实际游戏场景中显示它。这是我在场景初始化程序中的代码:

    let shaderSprite = SKSpriteNode(texture: nil, color: nil, size: CGSizeMake(100, 100))
    shaderSprite.shader = SKShader(fileNamed: "Player.fsh")
    shaderSprite.position = CGPointMake(200, 200)
    shaderSprite.zPosition = 1000
    addChild(shaderSprite)

精灵根本不显示,虽然我没有任何具有更高 zPosition 的节点。 在 sprite kit 游戏中使用自定义着色器的最佳做法是什么?

编辑:

我尝试了三种不同的着色器。例如,来自 WWDC 2014 “what's new in sk”会议的那个:

void main(void)
{
    float currTime = u_time;

    vec2 uv = v_tex_coord;
    vec2 circleCenter = vec2(0.5, 0.5);
    vec3 circleColor = vec3(0.8, 0.5, 0.7);
    vec3 posColor = vec3(uv, 0.5+0.5 * sin(currTime)) * circleColor;

    float illu = pow(1. - distance(uv, circleCenter), 4.) * 1.2;
    illu *= (2. + abs(0.4 + cos(currTime * -20. + 50. * distance(uv, circleCenter))/1.5));
    gl_FragColor = vec4(posColor * illu * 2., illu * 2.);
}

【问题讨论】:

  • 发布你的着色器代码
  • 完成,但我认为这更像是 SKSpiteNode 或 SKScene 问题,而不是着色器的问题
  • 非常感谢任何指向 iOS8 中 SKShader 使用示例的链接
  • 尝试使用实际上具有纹理或颜色的精灵,我敢打赌,当您不使用自定义着色器时,精灵甚至不会出现
  • 谢谢,LearnCocos2D。事实上,当我传递一个随机纹理而不是 nil 时,它确实出现了,甚至着色器也变得活跃

标签: ios opengl-es sprite-kit shader


【解决方案1】:

哎呀,打扰 stackoverflow 的圣人太容易了。 只需将虚拟纹理传递给 SKSpriteNode 初始化程序即可解决问题。

let shaderSprite = SKSpriteNode(imageNamed: "playButton")
shaderSprite.shader = SKShader(fileNamed: "TestShader")

let dummyTexture = SKTexture(imageNamed: "anyImageName")
shaderSprite = SKSpriteNode(texture: dummyTexture, color: nil, size: CGSizeMake(100, 100))
shaderSprite.shader = SKShader(fileNamed: "TestShader")

【讨论】:

  • 这是一个老问题,但您也可以指定颜色而不是虚拟纹理。 SKColor clearColor 无需实际显示任何内容即可工作。
猜你喜欢
  • 2016-02-26
  • 2012-09-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多