関数を使った式は、シェーダーでおなじみの参考演算子的な使い方をしてます。全て0の場合もこっちの計算が適用されるので、全て0になることもあるが、黒が書き出されるだけなので問題ない)。値を乗じたものが書き出し色になります。四つ並んだ左上の画像が、色置換のない素の画像です。(元ネタサイトの許可を得て画像を利用させていただいています)ほかの三つはそれぞれRGBを違う色に置換しています。光沢も出したい(白混色対応)自分としては、一応ここまでで十分目的は果たしたんですが、せっかく記事にしたのでもう少し発展させてみます。このシェーダーの弱点は黒との混色だけで白との混色には対応できていません。白との混色(ハイライト)が置換できないということです。上の絵を色置換したものが下の画像です。ハイライト部分が置換できていないのがわかります。シェーダー実装(拡張編)今まで、黒混色のみ対応していたシェーダーを、同時に白混色にも対応させます。関数だけなので、他は割愛します。r,g,bそれぞれに分けて三回計算しています。なるようになっています。なるような色が対象です。全体をまとめると、こんな感じの変換対応になります。変化なし!結果ご覧の通り、ハイライト部分も色置換できるようになりました!黄色、マゼンタ、シアンなどRGB系以外の色は影響を受けていないことも確認できました。更なるコード効率化(改良編)当初は上に挙げたコードで満足していましたが、白混色ももっとスッキリ効率的な書き方ができるんじゃないかと思って検討してみました。上手く行ったので下記に紹介します。}変数名の変更を除けば、実質的な計算は、黒混色だけの時から3行増えただけ&変換後の色算出に1項増えただけで済みました。詳しい説明まず、追加された冒頭の三行について。うちで最小値を求めています。うち二つが最小値になるはずです。元の色から最小値を引いた色です。RGBが等しいのでグレー系ですね。これは色変換後に足すべきベースの明るさを意味します。その次の三行は黒混色の時と同じ条件判定用の計算ですね。黒変換と白変換で同じ条件式が使えるようになっているはずです。追加されていることに注目してください。これで白混色の場合は元色と同じ割合だけ白成分が追加されます。黒(0,0,0)なので何も影響はありません。要するにPixelPerfectなドット絵前提ってことです。無圧縮にすることです。最近ある程度シェーダーが書けるようになってきた気がします。普段高級言語で開発してる時は、リーダブルコードを意識して、些細な効率よりも見やすい書き方を心がけてるんですが、たまにこういった、いかに効率的に書けるかっていう挑戦も面白くて、いい刺激になりますね。それだけだと、半年もすればどうしてこんな式で動くのか自分でも忘れてしまいそうなので、こうやって記事に残すのは備忘録としても役立ちそうです。requestStockLike10@Shinoda_NaokiFollow株式会社テクロス京都を拠点にソーシャルゲームの開発・運用、その他システム開発を行っています。