3

さまざまな程度に光る必要があるカスタムボタンを作成しています

ダイヤモンド

これらの写真を使用して、押したときにダイヤモンドが「光る」ボタンを作成し、この光が徐々に不活性状態に戻るようにするにはどうすればよいでしょうか?

私もいくつかの異なる色のダイヤモンドを大量生産したいと思っています...ここに示されている同じストック画像からすべての異なる色のダイヤモンドを生成したいと考えています。

利用可能な基本的な方法について頭を悩ませたいと思います。十分に詳細に、それぞれを確認して、どのパスを使用するかを決定できます...


これまでの私のもつれた努力...(解決策が展開するにつれて、これをすべて削除するか、おそらくいくつかの回答に移動します...)

3 つの潜在的なソリューション パスが表示されます。

  • GL
    は、プロセスを完全にきめ細かく制御するために必要なすべてを備えているように見えますが、コア グラフィックスによって公開された関数は、興味をそそられるほど近くにあり、多数のソース ファイルにまたがる数百行のコードを節約できます。そのような基本的なタスクには少しばかげています。

  • ブレンドを実現するためのコア グラフィックスコア アニメーション

    クロマキーマスキング ドキュメンテーションは言い続けます

    現在の塗りつぶしの色やその他の描画など、ペイントされていないサンプルの下にあるものはすべて透けて見えます。

    そのため、{0,0,0}、つまりキーとして黒を設定して、左の画像をクロマキー マスクできます。

    これにより、少なくとも透明な背景が確保されます。グレーではなく黄色にする作業が必要です。

    代わりに、画像コンテキストに黄色の背景色を設定することから始めて、CGContextSetBlendMode(...) を使用して黄色にダイヤモンドを刻印し、クロマキー マスキングを使用して透明な背景を取得することもできます。

    わかりました、これは少なくとも基本的な照明のない画像を画面上に表示することをカバーしています

    いくつかのブレンドモードを使用して、キラキラした画像を重ねることができます。おそらく、現在のグレースケール状態を維持することができます。これにより、元の色が強調されます。

    これに関する唯一の問題は、それが大量のリアルタイムブレンディングであることです

    だから、アニメーションのすべての画像を事前に計算できるかもしれません...これはますます厄介に見えます...

  • Cocos2D

    これにより、ブレンド モードを加算ブレンドに設定できる場合は、適切なアルファ設定を使用して、元の画像の上に光る画像を合成できます。

4

2 に答える 2

1

多くのドキュメントを掘り下げた後、最適な解決策は、コアグラフィックス関数を使用してソース画像を単一の2コンポーネントGLテクスチャに取得し、GLを使用してそれらをブレンドすることです。

均一な値glow_factorをシェーダーに渡す必要があります

明らかな解決策は単に使用するように見えるかもしれません

r,g,b = in_r,g,b * { (1 - glow_factor) * inertPixel + glow_factor * shinyPixel }

(inertPixelは不活性ダイヤモンドなどの適切なピクセルです)...

自分でスパークルを作って、その上に追加するのもいいようです。宝石は、その特徴的な色に関係なく、白く輝くはずです。

于 2011-04-30T09:32:40.633 に答える
0

この問題をもう少し詳しく見てみると、いくつかの解決策が見えてきます

解決策 A -- グロー = 0 からグロー = 1 へのトランジションを 60 フレームとしてメモリに保存し、必要になるたびに適切なフレームを GL テクスチャにロードします。

これには、グラフィック デザイナーがシーケンス全体を構築し、それを一連の PNG ファイルとして読み込むことができるという明らかな利点があります。

別の利点は、これらのフレームを順番に再生する必要がないことです...適切なフレームをオンザフライで選択できます

ただし、大量の送信データ RAM->VRAM の潜在的な欠点があります。

これは、glTexSubImage2D を使用して最適化できます。複数のフレームを同時に送信し、GL 内からアンパックすることができます。実際には、シーケンス全体である可能性があります。その場合は、PVRT テクスチャ圧縮を使用するのが理にかなっています。

iOS: フレームごとのグレースケール アニメーションをカスタム カラーで再生する

ソリューション B -- グロー = 0 とグロー = 1 の画像を GL テクスチャとして読み込み、グロー ファクターを均一として取り入れてブレンドを実行するシェーダー コードを手動で記述します。

これには、ワイヤーに近く、あらゆる方法で微調整できるという利点があります。また、非常に効率的になります。この利点は、維持するコードの大きな余分なスライスであるということです。

解決策 C -- glBlendMode を設定して加法ブレンドを実行します。
次に、glow=0 のイメージ イメージを描画します。たとえば、各頂点に alpha=0.2 を設定します。
次に、glow=1 イメージ イメージを描画します。たとえば、各頂点に alpha=0.8 を設定します。

これには、より一般的なコード構造で実現できるという利点があります。つまり、非常に一般的な 'draw textured quad / sprite' クラスです。

欠点は、ある種のラッパーがないと少し面倒なことです... 私のゲームでは、数ダースのダイヤモンドがあります.一度に2つまたは3つが光っている可能性があります. そのため、最初のパスですべてをレンダリングし (光っているすべてのものに適切にアルファを設定する必要があるだけです)、2 番目のパスで、光っているすべてのものに適切なアルファを使用して、光るスプライトを再度描画できます。


解決策 A を追求する場合、これにはある種のリアルタイム ムービー プレーヤー オブジェクトを作成する必要があることに注意してください。これは、非常に便利な再利用可能なコード コンポーネントになる可能性があります。

于 2011-06-15T04:27:52.517 に答える