トップページ > 過去ログ > 記事閲覧
256色bmp,pngファイルの透過色指定について
名前:Rxo 日時: 2009/11/12 21:33

ご無沙汰してます。 5年前にDxLib2.10でSTARGAZERを作ったRxoです。 今回、Vista・7に対応すべく、無謀にもDxLibの大幅VerUP(2.10→3.00e)を試みたところ ビルドはすんなりOKだったのですが 一部画像の透過ができなくなっておりました。 詳しく調べたところ、256色のbmp,pngファイルについては 透過したい色をパレット番号0にしないと透過されないような振る舞いでした。 (パレット番号240の黒の透過に失敗。画像の修正で透過を確認。) …5年のブランクでついていけてなくて非常に申し訳ないのですが 途中で仕様変更があったのでしょうか…

Page: 1 |

Re: 256色bmp,pngファイルの透過色指定について ( No.1 )
名前:管理人 日時:2009/11/14 22:48

お久しぶりです、今でも偶にRxoさんのサイトを覗かせて頂いてます 透過色についてですが・・・ はい、ソフトウエアレンダリングモードだけですが仕様変更がありました すいません・・・ ハードウエアアクセラレータを使用する通常の場合ではパレット画像は 最終的にテクスチャと同じ16bit or 32bit カラーに変換されるので 複数のパレットに透過色があっても全て透過されるのですが、 ソフトウエアレンダリングモードの場合は3年ほど前にパレット画像を パレット画像のまま描画処理に使用するようにしたので、複数透過色( 透過色として 使用するパレット番号 )があると透過色かどうかの判定にかかる負荷が高くなってしまうので、 指定の透過色に一致する最も番号の若いパレットが透過色( 透過パレット )とするようにしました また、パレットの色情報も画面モードの色数に応じて減色されますので、16ビットカラーの画面モードの 場合はパレットも24ビットから16ビットに変換されてしまいますので、透過パレットの判定の際に 透過色に近い色のパレットが透過パレットとして判断されてしまう場合があります ( 例:透過色が R=0,G=0,B=0 の場合、24ビットカラー時で R=0,G=2,B=0のパレットが透過パレットとして判定されます ) 仕様変更でご迷惑をお掛けしてしまいますが、一応パレット画像をパレット画像として扱うようになった利点もあります ソフトウエアレンダリングモードでパレット画像を扱う場合のみ、以下の関数で画像に対するパレット操作ができるようになりました // メモリ上に読み込んだ画像のパレットを取得する(フルカラー画像の場合は無効) Red, Green, Blue に格納される値は 0〜255 int GetGraphPalette( int GrHandle, int ColorIndex, int *Red, int *Green, int *Blue ) ; // メモリ上に読み込んだ画像の SetGraphPalette で変更する前のパレットを取得する Red, Green, Blue に格納される値は 0〜255 int GetGraphOriginalPalette( int GrHandle, int ColorIndex, int *Red, int *Green, int *Blue ) ; // メモリ上に読み込んだ画像のパレットを変更する(フルカラー画像の場合は無効) Color は GetColor で取得できる値 int SetGraphPalette( int GrHandle, int ColorIndex, int Color ) ; // SetGraphPalette で変更したパレットを全て元に戻す int ResetGraphPalette( int GrHandle ) ; あと、ソフトウエアレンダリングの世界では32ビットカラーより16ビットカラーの方が今でも高速です ただ、ウインドウモードの場合はデスクトップ画面が32ビットカラーだと ScreenFlip 時に 画面の画素情報を16ビットカラーから32ビットカラーに変換する工程が入るのでデスクトップ画面が 32ビットカラーですとソフトが16ビットカラーでもそれなりに低速です ちなみに、Vista 以降フレームバッファを画面に出力する処理が異様に時間が掛かるようになりましたので、 秒間60コマのソフトで1フレームに使用できる 16.66666...ミリ秒の内、8ミリ秒くらいを ScreenFlip だけで 消費してしまうようになりました ソフトウエアレンダリング時は GDI を使用しているのですが、まだ試していないので確定はしていませんが Vista以降では恐らく Direct3D9 を使用して画面サイズ以上のサイズのテクスチャを作成してそこに 毎フレームソフトウエアレンダリングの結果を転送して三角形ポリゴン2枚にそのテクスチャを貼り付けて フレームバッファに書き込むという方法を採ったほうが高速にフレームバッファを画面に出力できるような気がします ( 時間があるときに試してみます )
Re: 256色bmp,pngファイルの透過色指定について ( No.2 )
名前:Rxo 日時:2009/11/15 20:55

主題の件、了解しました。 パレット関数、色違いのキャラがたくさんいるゲームを作っていますので、欲しいなと思っていたところでした。 ありがとうございます。 Vista以降でフレームバッファ転送が極端に遅くなる件も、情報ありがとうございました。 ・・・エアロの所為でしょうか。
Re: 256色bmp,pngファイルの透過色指定について ( No.3 )
名前:管理人 日時:2009/11/19 13:21

エアロのせいかどうかは分かりませんが、エアロを導入するためにそれまでのデスクトップ描画方式とは 大きく仕様が変わったのが原因だとは思います( エアロ時はデスクトップ描画に Direct3D を使っているみたいですし )

Page: 1 |