301 Moved Permanently

Moved to https://vow.g.hatena.ne.jp/vow/

禁断の禁断の裏側

人が神秘を生み怪物を成す本質は不理解にある

(続き)

ぬたこすぺしゃるの薄っぺらな化けの皮を根こそぎへっぱがしてみるテスト。

assume

あるRGB値 F のべた塗り平面を画面上に描画する際に、αチャネル付きテクスチャ T, Tα が適用されていたと仮定すると、画面上の座標 (x,y) のピクセルの描画結果 C は次のようになります。

  • C(x,y) = (1−Tα(x,y)) F + Tα(x,y) T(x,y)

今回の題材は髪の描画なので、RGB値 F とはすなわち髪の設定色であり、これは既知であると仮定します。またピクセル C(x,y) の集合とはすなわちスクリーンショットそのものであり、実験的に測定可能です。

ここでテクスチャ T に彩度のある成分が含まれていると、描画結果は髪の設定色に関係なくそのテクスチャの色相の影響を受けることになります。これは髪飾りの部分などごく一部の例外を除き実際には存在していないと思われます。そこで問題としている座標範囲において T は彩度成分を一切含んでいないものと仮定します。つまり各ピクセルにおいてテクスチャ T(x,y) の各チャネル成分は全てグレースケール値 TW(x,y) に等しいことになります。

  • TR(x,y) = TG(x,y) = TB(x,y) = TW(x,y)

><

ここでRGBの3つのチャネルのうちから二つを選び a, b とします。Tα' = 1−Tα とおいてチャネル間で和差をとると

  • Ca−Cb = (Fa−Fb) Tα'
  • Ca+Cb = (Fa+Fb) Tα' + 2TαTW

髪の設定色 F = [FR,FG,FB] において Fa ≠ Fb であれば

  • Tα' = (Ca − Cb) / (Fa − Fb)
  • TW(Ca + Cb − (Fa+Fb)Tα') / 2Tα

となり、スクリーンショット C(x,y) と既知の髪の設定色 F から髪の描画テクスチャ T(x,y), Tα(x,y) を各ピクセル毎に逆算することができます。

apply

この方法で実際にテクスチャ逆算をするために必要な条件は、大きく分けて以下の3点です。

  1. 髪の設定色 F が厳密に既知であること
  2. 設定色 F から2チャネルを選んだときにその値の差を十分に大きくとれること
  3. 仮定通りの画面描画が行われるような条件下でスクリーンショットを1枚とれること

まず第一の点については、キャラ作成時または髪染め成功時の元の髪染め液の色サンプル表示のRGB値が、そのまま厳密に髪の設定色になると仮定することで対応します。第二の点は設定色 F の彩度が十分に高いことというのと同義です。新規キャラ作成であれば金髪 [230,180,0] を用いて a=R, b=B とおけば必要十分な精度を確保できるでしょう(この場合に限定すれば Fb=0 なので式も簡単になります)。

最後の三番目の点についてはテクスチャ逆算の本質とは関係ないわりに長くなるのでひとまず後回しにして、とりあえず実際のテクスチャ逆算の様子を。

まずはとにかく一枚スクリーションショットをとります。

とれたらそいつにテクスチャ逆算の計算を施します。右の画像では R=TW, G=Tα', B=Tα として表示しています。ここで緑の部分は髪の設定色に、青の部分は黒、赤っぽい部分は白に寄ることになります。

髪の毛でない部分にまで同じ計算をしているので当然でたらめなことになりますが、気にしてはいけません。

逆算テクスチャから元の髪の色を再構成した画像。髪の毛の部分で元のスクリーンショットと見分けはつきますか。

再構成がまともに通ることは、これまでの仮定と計算が(ある精度の限度内において)正しいことを保証してくれます。

元のスクリーンショットと再構成画像との差分をとって8倍したものです(オフセット128)。髪の毛でない部分については仮定が全く成り立たないので当然でたらめであることがはっきりしますが、髪の毛の部分についてはほとんど誤差がないことを示すグレーのベタになっているのがわかるでしょう。

よく見ると R, B チャネルに比べて G チャネルの方が微妙に誤差が多いことに気付きますが、誤差成分と元画像ないし逆算テクスチャの間に特段の相関関係があるようには見えないので、たぶんそれほど大きな問題は無いのではないかとなんとなく思える気分がしてくれるといいなー(←超弱気)。

lightings

最後の三番目の条件はなんともあやふやで微妙なところなのですが、

  • シェーディングは切る
  • fogがかかっている場所・状況での撮影は論外
  • 最大の平行光源がもっとも強い白昼に撮影を行う
  • 時間に影響されない固定光源が設定されている場所をつかう
  • 周辺に混沌石をもったプレイヤーキャラを配置して照明にする
  • 意図した照明以外の光源が明滅しないよう他のプレイヤー等に注意する
  • 特に魔法詠唱など色付きの光源は絶対に入り込まないようにする

というような細かい配慮の積み重ねでおおむねだいたいそれらしい風になります。

preview ghostの作成をするだけであれば、とにかくスクリーンショットを1枚とれればそれでよくて、必要となる一貫性はその一枚のスクリーンショットの中だけで完結しているのでまだしも楽なんですが、逆算テクスチャを逆向きに使って未知の髪の設定色を割り出そうとする場合には当然そうはいかないわけで、比較する2枚のスクリーンショットの間で勝手に光源条件が変化しないよう細心の注意を払う必要があります。

つまるところ禁断の逆算固定もこうした地道で泥臭い話の積み重ねでできているということです。ネタをばらしてしまえば意外とたいしたことないってのはまあこの世の道理。