CIPixellate Core Image Filter を Sprite Kit シーンに追加するにはどうすればよいですか?
SKScene またはそのサブクラスである SpriteKit シーンがあります。Core Image フィルターをシーンに追加したいと考えています。具体的には CIPixellate フィルターなので、無料で 8 ビットのゲーム天国を手に入れることができます。
それ、どうやったら出来るの?
CIPixellate Core Image Filter を Sprite Kit シーンに追加するにはどうすればよいですか?
SKScene またはそのサブクラスである SpriteKit シーンがあります。Core Image フィルターをシーンに追加したいと考えています。具体的には CIPixellate フィルターなので、無料で 8 ビットのゲーム天国を手に入れることができます。
それ、どうやったら出来るの?
これはまったく難しいことではありません。コア イメージ フィルターのドキュメントが古くて粗雑であり、 SpriteKit の場合、SKEffectNodeドキュメントを含め、ドキュメントが完全に誤解を招くか不完全であるというだけです。SKEffectNodeのドキュメントには、SKEffectNodeのfilterプロパティについて(この投稿の時点で) 次のように記載されています。
Core Image フィルターには、単一の inputImage パラメーターがあり、単一の outputImage パラメーターを生成する必要があります。デフォルト値はゼロです。値が nil でエフェクト ノードが有効な場合、フィルタリングは行われません。ただし、その子は引き続き別のパスでレンダリングされ、親のフレーム バッファにブレンドされます。
Core Image Filter カタログには、CIPixellate には次のパラメーターのキーがあると記載されているため、これは一種の有益な情報ですが、 それほど有益 ではありません。
では、その方法を見てみましょう。
まず、SKSceneはSKEffectNodeから継承することに注意してください。つまり、CIFilters を追加できます。素晴らしい。
あなたがする必要があるのはこれだけです。
最初に CIFilter を作成します。
CIFilter *pixellateFilter;
pixellateFilter = [CIFilter filterWithName:@"CIPixellate"];
[pixellateFilter setDefaults]; // Remember to setDefaults...
// We could change some value but for this one we won't.
// [pixellateFilter setValue:@(10.0) forKey:@"inputScale"];
次に、実際に効果をレンダリングするように SKEffectNode を構成します!
[aScene setShouldEnableEffects:YES];
フィルターを中央に配置することは悪い考えではありません。しかし、走行距離は異なる場合があります。
[aScene setShouldCenterFilter:YES];
次にフィルターを追加します。
[aScene setFilter:pixellateFilter];
これは、親ノードに追加する前でも後でも、画面上に表示する前でも後でも追加できることに注意してください。これを行うためにカスタム SKActions を構築することもできます... :)
これらすべてからわかることの 1 つは、コア イメージ フィルター カタログは、古いものと同じように、さまざまなフィルターがさまざまな CICategory 型のメンバーであることを示しているということです。ただし、基本的に、特定のカテゴリで機能するものはすべて、そのカテゴリの他のフィルターも機能する可能性があることを意味すると想定できます:)