で、だ。まずはとりあえず640×480の256色のデータを表示させよ うと試みた。 フレームバッファにLoadImage()を使ってロードしてみた。
ex.1
void load_image( u_long *p ) { RECT rect; rect.x = 0; /* ロード先の開始X座標 */ rect.y = 0; /* ロード先の開始Y座標 */ rect.w = 640; /* ロードの幅 */ rect.h = 480; /* ロードの高さ */ LoadImage( &rect, p ); /* p にあるイメージをフレームバッファへロード */ }ふっふっふ、なんだ簡単じゃないかぁ!と思ってたのに結果はうまくいかず。 なんでなんだ、なにがいけないと言うんだ!!
・・・続く
ぺらぺらとめくっていくと,16ページにCLUT(カラールックアップテ ーブル)の欄があった。
Mr.K 「なになに?テクスチャーには3つの色モードがある!?」
3つのモードとは、
ここで標準添付されている「Timutil.exe」 を利用してみると、モードが分 かるのだ。早速読み込んでみると・・・
Mr.K 「ふむふむ、8bitモードか。ま、256色(2の8乗)だし、あたり まえか」
とりあえず 8bit CLUTだということが分かった。
で、User's Guideをさらに読んでいくと,42ページにフレームバッファ詳 細というのがあり、そこにはこうあった。
Mr.K 「フレームバッファは16bitピクセルが構成する1024×512の2次元アドレ ス空間???どういうことだろう?(^^;」
・・・ん?つまり、フレームバッファは16bit DIRECTモードだと,1024×512 分の空間があるってことで,8bit CLUT だと1ピクセルに使うフレームバッフ ァが半分で済む。4bitだとさらに半分・・・。
Mr.K 「あ、そうか!この絵は8bit CLUTなのに16bit DIRECT扱いされているフレ ームバッファに転送しただけだから横方向が半分になっちゃうんだ」
ここで先ほど活躍した「Timutil.exe」 に再度ご登場してもらう。これには 色モードを変換する機能(っていうか、モードを選択し直してセーブする)が あるからだ。
8bit CLUTを16bit DIRECTにすれば、LoadImage()でフレームバッファに転送 するだけで画像が見れるはずだ!
さて、変換してみて前回のソースで転送してみた。すると・・・
Mr.K 「やりぃ!見れたぜ!(^^v」
私は自分の興奮を押さえつけようと,ふとたばこに火をつけ,一服した。
Mr.K 「でも,まてよ??8bit CLUTを16bit DIRECT にするってことは、わざわ ざ利用するフレームバッファを無駄に増やしてる。なんか資源の無駄遣 いだなぁ。それに、フレームバッファ直書きだから、応用も利かないし なぁ。だぁぁ、まだまだ道は険しい!」
明日無きMr.Kの戦いは続く・・・
p.s.
フレームバッファは16bit DIRECTモードでいう1ピクセル(絵の1ドットっ てところでしょうか)で1024×512 分ある。8bit CLUT だと、8bitで1ピクセ ルを構成することになるので,単純に言えば2048×512分の絵の情報を置くこ とが出来る。
16bit DIRECT OOOOOOOOOOOOOOOO <--------- 1 ピクセル ---------> 8bit CLUT OOOOOOOOXXXXXXXX <- 1 ピクセル -><- 1 ピクセル ->16bit DIRECTの1ドット(1ピクセル)は、8bit CLUTの2ドット(2ピクセ ル)となる。
まずはBGの利用を考えた。そのためにはまずGsBGという構造体の内容を調 べなくてはならない。ライブラリリファレンスを読んでみると、GsBGは内包的 にGsMAPとGsCELL を含んでいる。
Mr.K 「構造体同士の関係が難しそうだなぁ。ただ単に絵を表示するだけだし、 クリッピング処理とか必要ないし。」
とくると、スプライト機能ってことになる。 PSのスプライト機能っていうのは、一般のスプライト機能とはどうやら違 うらしく、ポリゴンにテクスチャを貼るということで実現しているようだ。
Mr.K 「おお、これなら3Dでも役立ちそうだ。こっちに決めよう。」
GsSPRITEのメンバ構造は、ライブラリリファレンスの30ページから記述さ れている。じっと眺めてみると・・・
Mr.K 「あ、色のモード切替はattributeで設定できるじゃん。」
31ページの真ん中あたりに 24-25:スプライトパターンビットモード とい う項目があり、前回頭を悩ませていた問題はあっと言う間に解決してしまった。
Mr.K 「tpageっていうメンバはなんだろう?」
32ページを読んでみると、スプライトに貼り付けるTIMが存在するペー ジらしい。テクスチャーページとフレームバッファとの関係がポイントとなる。
全フレームバッファ(1024X512)におけるtpageの関係 <--------------------------- 1024 --------------------------------> - +----------+----------+----------+----------+--- ・・・ ---+----------+ | | | | | | ・・・ | | | | tpage 0 | tpage 1 | tpage 2 | tpage 3 | ・・・ | tpage 15 | | | | | | | ・・・ | | | size | | | | ・・・ | | 5 |(16bit時) | | | | ・・・ | | 1 | 64 * 256 | | | | ・・・ | | 2 +----------+----------+----------+----------+--- ・・・ ---+----------+ | | | | | ・・・ | | | | tpage 16 | tpage 17 | tpage 18 | tpage 19 | ・・・ | tpage 31 | | | | | | | ・・・ | | | | | | | | ・・・ | | | | | | | | ・・・ | | | | | | | | ・・・ | | - +----------+----------+----------+----------+--- ・・・ ---+----------+tpageの大きさは64X256となっているが、これは色モードによって変化 する。
Mr.K 「GsSPRITEの使い方は分かってきたかも!?ちょろいぜ」
この過信が命取りにならなければよいが・・・
次に続く