Heliodor 2020/08/04 17:42

パレットを無理やり実装する

前にもチラッと似たような話を書いた気がしますが今回はもう少し詳しく。


滅びの国の王女では、某姫様の服装や肌の色を何種類も用意して切り替えることができるようにしてありました。
これはカラーパレットを使って切り替えているのですが、実現にはちょっとした苦労があったんです。



改めて見ると、あんまりエロと関係ない部分に全力投球よくこんなの作ったなーと思います。
余談ですがこの青は個人的にローレシア・ブルーと呼んでました。隣の緑がサマルトリア・グリーン。白がロンダルキア・ホワイト(以下キリが無いので省略)。


まず Direct3D にフツーに用意されている D3DFMT_P8 フォーマット(インデックス画像用のテクスチャフォーマット)を使ってみたのですが、このフォーマットに対応しているビデオカードが意外と少ないということが分かりまして(実際自分の環境では D3DFMT_P8 な IDirect3DTexture9 が作成できなかった)、パレット処理を Direct3D に丸投げする方法は諦めました。

そうしたらもう、ピクセルシェーダー(HLSL)を使ってリアルタイムにパレットを適用しながら描画するしかないな……と思いますよね?
違うんですよ。実はピクセルシェーダーなんて使ってないんです。

なんでそんなマゾい事を??と思うかもしれませんが、それは「ピクセルシェーダーはただの背景とかエフェクトとか、万が一全く描画されなくてもプレイに支障のない部分にしか使わない」という自分縛りがあったからです。


実はヴィータ大脱出も普通にピクセルシェーダーを使って描画していたのですが、プレイされた方から「うちのPCで画面が真っ黒になるんです」という報告がありました。
よくよく聞いてみると、その方が使っていたのは 2004年に発売された Windows XPのPCだったんです。しかも法人向け。プログラマブルシェーダーには一切対応していない。
ヴィータ大脱出のリリースは2013年頃だったので、当時でも既に9年落ちだったわけですが……。

まあ、きっとまだまだ古いPCを使ってる人も多いよな……ということで、プログラマブルシェーダーは一切使わないか、使ったとしても最低限、ゲームに影響のない部分(仮に描画に失敗して真っ黒になったとしても一応ゲームは進められる)だけにしようと考え、アップデートで丸ごと修正しました。めっちゃ大変でした


で、その流れで滅びの国の王女でパレットを使って色を切り替えられるようにしようと思った時も、ピクセルシェーダーを使ってパレットを適用するという方法は採用しなかったのです。

結局どうしたかといいますと、ユーザーがパレットを選ぶたびにテクスチャー自体を描き換えるという力業でやるようにしました。
メニューで色番号(パレット番号)を選択するたびに、王女のテクスチャーを Lock して中身を書き換えて Unlock するという……。


手順としてはこうです。

1.インデックス番号をそのままRGB値として書き込んだ、なんちゃってインデックス画像を用意する
 (要するに D3DFMT_P8 の代わりに普通に D3DFMT_A8R8G8B8 のテクスチャを使う。そのまま表示すると変なグレースケール画像みたいに見える)
2.パレット画像(16x16)を必要なパレット個数だけ用意する
3.スプライトを表示するためのテクスチャーが要求された場合
  ・そのテクスチャが未ロード状態であれば、ロードしてパレットを適用する(全ピクセルを書き換える)。
   このとき、テクスチャーと、それに適用しているパレット番号の組を記録しておく
  ・テクスチャがロード済みであれば、そのテクスチャに適用しているパレット番号が一致するか確認する。
   一致すればロード済みテクスチャをそのまま返す。
   パレット番号が一致しない場合は一旦テクスチャーを破棄して、改めてロード、パレット適用の手順を行う


思えばこれは、滅びの国の王女ではそう頻繁にパレットを切り替えないからうまく動作していたような気がします。



カラー変更したらプレイヤー・相棒・モブキャラはもちろんタイトル画面まで全部カラーが変わるのはこだわり。というかドット絵の強み。でもゲーム性にはあんまり関係ありませんw


この通り、基本カラーの変更までは順調だったのですが……サ○バークロスみたいにパワーアップで色が変わるようにしよう!と思い付いてからは、それはもう茨の道でした……。我ながらアホです。

詳しい説明は省きますが、結構頻繁にパレットが変わるので、そのたびに再ロード&書き換えとかやってると処理待ちが発生して動きがカクカクになるんです。
さらに、同一のインデックス画像に別々のパレットを適用して、それらを適用させた複数のキャラクターが同時に出てきたりすると、ちょっと自分でも処理内容の把握が……パレット関係の処理は、眠い時にやってはいけない作業項目ランキングでぶっちぎりの1位です。



基本カラーを赤にしたした状態でパワーアップ「碧」を取る。
会話シーンでは主人公だけ色が変わっていて、相棒の色は赤のまま。そして更にパワーアップ「朱」を取る……。もうワケが分かりませんw


まあカクつきは頑張って実用に耐えうる(?)ところまでは改善させたのですが、テクスチャを自分で書き換えてパレットを適用するっていう力技な部分は相変わらずです。

今時シェーダーなんてスマホでも使えますからね。さすがにもう良いですよね。
というか「XPだと画面が変になります」とか「Vistaだとスローモーションみたいになります」ってメール来るのそろそろ許して下さいw

次にパレット使うようなゲームを作ることがあれば、その時は全力全開でピクセルシェーダーを使って実装しようと思っています。


以下宣伝

ヘリオドールの過去作品が現在半額セール中です。
(FANZA様でも半額セール始まってました)

本文中でちょっと話題に出てきた滅びの国の王女、今なら440円です。
お持ちで無い方はこの機会に是非。



DLsite 販売ページへのリンク
FANZA 販売ページへのリンク


DLsite 販売ページへのリンク
(滅びの国の王女はDLsite様の専売作品です)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索