ようこそ!Mr.KのHomePageへ

TVK作成日記

最終更新日 1996/10/07

もくじ

  1. TVK作成日記その1
  2. TVK作成日記その2
  3. TVK作成日記その3
トップメニューへ行こう


TVK作成日記その1

3Dの知識もなく、サウンドの才能もない私は、とりあえずTIMデータを表示するべく、 超簡単なビューワーを作ろうと試みた。 目指すはマルチビューワー!なんて大きい(?)夢を抱きつつ、PSのプロ グラミングは初めて。こんなんで作れるのだろうか(^^;。

で、だ。まずはとりあえず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 にあるイメージをフレームバッファへロード */
}
ふっふっふ、なんだ簡単じゃないかぁ!と思ってたのに結果はうまくいかず。 なんでなんだ、なにがいけないと言うんだ!!

・・・続く


TVK作成日記その2

前回、640×480×256色の絵がうまく表示されなかった。なんでだ ろうと悩んでもしようがないので,とりあえずUser's Guideを読んでみること にした。

ぺらぺらとめくっていくと,16ページにCLUT(カラールックアップテ ーブル)の欄があった。

Mr.K 「なになに?テクスチャーには3つの色モードがある!?」

 3つのモードとは、

  1. 4bit CLUT
  2. 8bit CLUT
  3. 16bit Direct
の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ピクセ ル)となる。


TVK作成日記その3

とりあえず前回640X480X256の絵を表示させることは出来たが、 まだまだ問題点は残った。

  1. 絵の表示をプログラムレベルで操作するのではなく、データレベルでの変換が必要となり、面倒である。
  2. ただのVRAM(フレームバッファ)へのロードな為、ゲームなどへの応用力に欠ける。
これを回避するため、2つの考えが浮かんだ。それは、BGの機能を使うか、 スプライト機能を使うかである。

まずは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となっているが、これは色モードによって変化 する。

  1. 16bit Direct の場合 64X256ピクセル
  2. 8bit CLUT の場合 横方向に2倍になるので、128X256ピクセル
  3. 4bit CLUT の場合 横方向に4倍になるので、256X256ピクセル
となる。したがって、GsSPRITEのメンバである u,v が unsigned char なのは この為なのだ(?)。 このtpageの計算は、55ページのGetTPageにより計算できる。

Mr.K 「GsSPRITEの使い方は分かってきたかも!?ちょろいぜ」

この過信が命取りにならなければよいが・・・

次に続く


トップメニューへ行こう

Forum Beginner HotNews Gallery Member'sHome Help

ネットやろうぜ!

Mr.Kへおてまみ