SKShaderを使うことで、SpriteKitにもフラグメントシェーダを実装できるってことで、SKShaderクラスを試してみました。
サンプルコードはこちら
こんなことができる(左:デフォルト表示 右:カスタムシェーダ実行)
とりあえずは、プロジェクトにフラグメントシェーダのソースを追加してください。
Xcodeでは追加ファイルにシェーダが無いみたいなので、Other -> Empty ファイルを追加しました。
(サンプルではdemo.fshで追加)
以下のコードが、demo.fshの内容です。
void main() {
// 中心からの位置を求める
vec2 uv = v_tex_coord - vec2(0.5, 0.5);
float len = length(uv);
// 1秒で1周期
float time = mod(u_time, 1.0);
// sinの値から参照するテクスチャのカラーを取得
float sinVal = 1.0 + sin( 2.0 * 3.1415 * (len / 0.1 - time)) * 0.1;
uv *= sinVal;
vec4 texel = texture2D( u_texture, uv + vec2(0.5, 0.5));
gl_FragColor = texel;
}
次にSpriteKitで画像を表示するコードは以下のとおり。
(プロジェクトはiOS->Application->Gameで作成しています)
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
let bgNode = SKSpriteNode(imageNamed:"bg")
bgNode.size = CGSize(width: 311, height: 407)
bgNode.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
// let shader = SKShader(fileNamed: "demo.fsh")
// bgNode.shader = shader;
self.addChild(bgNode)
}
}
上記のコードのカスタムシェーダ追加部分のコメントを外すとカスタムシェーダに対応したSKSpriteNodeになります。
// demo.fshの読み込み
let shader = SKShader(fileNamed: "demo.fsh")
// bgNodeにカスタムシェーダを適用
bgNode.shader = shader;
シェーダを使うとSpriteKitでの表現の幅が広がるので色々楽しそうな感じです
この記事を書いた人
- アプリ開発チームで、iOSエンジニアやってます。 *'``・* 。 | `*。 ,。∩ * + (´・ω・`) *。+゚ `*。 ヽ、 つ *゚* `・+。*・' ゚⊃ +゚ ☆ ∪~ 。*゚ `・+。*・ ゚
この投稿者の最近の記事
IT関連2018.04.05僕も育休取らしていただきます
iOS2015.10.21年に1度の、Apple Developer Programの更新
iOS2015.04.01無謀にも時計のアプリをAppleWatch対応で申請してみたよ
iOS2015.02.27SpriteKitのSKShaderを試してみた【iOS8〜】





