使用着色器非常容易。将一个名为“TheShader.fsh”的文本文件添加到您的项目中:
void main()
{
float yPos = gl_FragCoord.y - labelBase;
float gradient = yPos / u_sprite_size.y; // ranges from 0 at base to 1 at top
vec4 color = SKDefaultShading(); // the current label color
color = vec4(gradient + color.r, gradient + color.g, gradient + color.b, color.a);
color.rgb *= color.a; // set background to alpha 0
gl_FragColor = color;
}
现在在 SKScene 中创建一个 SKEffectNode,将其着色器设置为“TheShader”,并将您的标签添加为效果节点的子节点。标签将使用垂直渐变绘制,范围从底部的标签 fontColor 到顶部的白色。
override func didMoveToView(view: SKView)
{
makeGradientLabel("318 nodes 60.0 fps", labelPosition: CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)))
}
func makeGradientLabel(labelText: String, labelPosition: CGPoint)
{
let myShader = SKShader(fileNamed: "TheShader")
let labelBase = SKUniform(name: "labelBase", float: Float(labelPosition.y))
myShader.addUniform(labelBase)
let effectNode = SKEffectNode()
effectNode.shader = myShader
effectNode.shouldEnableEffects = true
addChild(effectNode)
let theLabel = SKLabelNode(fontNamed: "Courier")
theLabel.fontSize = 36
theLabel.fontColor = SKColor.blueColor()
theLabel.text = labelText
theLabel.position = labelPosition
effectNode.addChild(theLabel)
}
如果您移动标签,您需要更新 labelBase 制服,以便着色器知道它在哪里:
labelBase.floatValue = Float(theLabel.position.y)