スプライトの色を変更するにはどうすればよいですか?


7

私のリズムゲームには、ノートチャートによって異なる色のノートオブジェクトがあります。使用するすべての異なるカラーバリエーションを持つスプライトシートを使用できますが、これをパラメーター化したいと思います。(各ノートスプライトは、色相のさまざまな色合いで構成されています。たとえば、赤いノートは、赤、明るい赤、濃い赤のみを持ちます。)

スプライトを新しく着色するにはどうすればよいですか?

私はOpenGLを使用していますが、アルゴリズムや数学の説明で十分です。:)

回答:


8

おそらく、アルファチャネルを備えた単一のカラーイメージ(たとえば、ノートスプライト)を使用し、その後、ベースカラーでイメージ全体を着色します。それで、次の画像のようなもの(ウィキメディア・コモンズから):

音符の画像

色が赤の場合、ノート(すべての黒い部分)を同じ赤で着色します。さらに必要なのは、ノートの陰影が付いたグレースケールイメージです。次に、乗算スクリーンなどのブレンドモードを使用して、シェーディングとフラットカラーを組み合わせます

別の、おそらくより簡単なアプローチは、選択した色で各色成分を乗算するグレースケール画像を用意することです。したがって、のグレー値0.5と赤い色RGB(1.0, 0.0, 0.0)があるRGB(0.5, 0.0, 0.0)場合、指定されたピクセルでその結果になります。

更新:これがブレンドモードで私が何を意味するかを説明するためのサンプル画像です:

レイヤーのブレンド

もちろん、ハイライトが必要ない場合は、シャドウレイヤーを使用することもできます(これは、基本的に、前述のより簡単なアプローチと同じです)。


2
これは話題外ですが、私は尋ねなければなりませんでした-どのようにしてその2番目のイメージを作成しましたか?
DMan

@DMan Photoshopでさまざまなノート画像を作成し、次にIllustratorでアレンジします;)
bummzack

ご説明ありがとうございます。:)フラグメントシェーダーにブレンドすることは可能ですか?それとも、openglブレンド関数を使用して3つの画像を個別にレンダリングする方が望ましいですか?
Mr_Qqn

私はシェーダーの専門家ではありませんが、私の限られた知識から、問題にはならないと思います。または、CPUで必要な画像を事前に計算することもできますか?
bummzack

はい、今のところ、すべてのバリエーションを持つスプライトシートを生成します。
Mr_Qqn

3

表示する画像のグレースケール(または白のみ)バージョンを、適切なアルファチャネルを使用して作成します。頂点カラーを使用して画像を「染色」します。

頂点カラーは各チャネルを乗算するので、白x赤=赤、50%グレーx赤= 50%赤、というようになります。


この問題は、明るい色(黄色など)を使用すると、シェーディングが認識されなくなることです。
bummzack

よく分からない。グレースケールイメージの黒または非常に暗い灰色に非常に明るい黄色を掛けたものは、依然として黒または非常に暗い黄色です。
ggambett、2011

ところで、申し訳ありませんが、私はあなたの答えで「おそらくもっと簡単なアプローチ」を見ていませんでした。
ggambett、2011

1
あなたは乗算について正しい。混同していた。コーヒー不足だと思います。
bummzack

回答ありがとうございます。私はopengl 3を学んでいるので、他の方法を使用したいと思います。:)
Mr_Qqn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.