【问题标题】:How to draw gradient in SKShapeNode?如何在 SKShapeNode 中绘制渐变?
【发布时间】:2021-12-22 20:00:35
【问题描述】:

我正在尝试在 SKShapeNode 对象中绘制渐变。

我使用 alpha 分量绘制了一个带有颜色的三角形,它工作正常。我想添加渐变,使三角形的一个边缘慢慢消失到背景中。我想要实现的是模拟角色的视线范围。

我找到了一个关于这个挑战的答案:How to apply a gradient to SKShapeNode created from a path,但答案在 XCode 13.1 中不起作用。 原因是无法编译添加SKTexture的建议解决方案:

var testTexture = SKTexture(size: CGSize(width: 200, height: 1), color1: CIColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 1.0), color2: CIColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 0.0), direction: GradientDirection.Left)

它会导致错误“在范围内找不到'GradientDirection'...”。而且我找不到任何其他添加渐变的方法。

我找到了另一个答案,它说这是不可能的,但它是从 2013 年开始的,所以可能发生了一些变化 (How to create a Gradient in Spritekit?)。

我也尝试了这个解决方案:https://augmentedcode.io/2017/11/12/drawing-gradients-in-spritekit/,但它不会产生任何效果并降低应用程序的性能。

【问题讨论】:

    标签: swift sprite-kit skshapenode


    【解决方案1】:

    来自互联网的一些来源将我定向到 OpenGL 着色语言:https://www.khronos.org/opengl/wiki/Core_Language_(GLSL)

    这里是部分解决方案:

    let sight = SKShapeNode()
    let gradientShader = SKShader(source: "void main() {" +
                                              "float distanceFromCenter = distance(v_tex_coord, vec2(0.5,0.5));" +
                                              "gl_FragColor = vec4(0.6, 0.3, 0.0, distanceFromCenter*6.0);" +
                                              "}")
    sight.fillColor = .clear
    sight.fillShader = gradientShader
    

    以下是有用的链接:Drawing a circle with a shader in SpriteKithttps://thebookofshaders.com/02/Add shader for SKShapeNodehttps://developer.apple.com/documentation/spritekit/skshapenode/controlling_shape_drawing_with_shaders

    上述解决方案已经完成了一半,但又过了几个小时,我设法实现了我想要的。

    let pos = n.sprite.position
    let frame = n.sight.frame
    let x = (pos.x - frame.minX) / frame.width
    let y = (pos.y - frame.minY) / frame.height
    let gradientShader = SKShader(source: "void main() {" +
                                              "float distanceFromCenter = distance(v_tex_coord, npcLocation);" +
                                              "float alpha = 0.8 - distanceFromCenter;" +
                                              "if (alpha < 0) { alpha = 0.0;}" +
                                              "gl_FragColor = vec4(0.0, 0.0, 0.0, alpha);" +
                                              "}")
      gradientShader.uniforms = [SKUniform(name: "npcLocation", vectorFloat2: vector_float2(Float(x), Float(y)))]
      n.sight.fillColor = .clear
      n.sight.fillShader = gradientShader
    

    【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多