ホーム   »  スポンサー広告  »  スポンサーサイト   »  PSPプログラミング  »  第9弾 : VRAM解説

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第9弾 : VRAM解説

もう開き直ります。
マイペースでいきます。

今回はVRAMと呼ばれる画面情報の格納されるメモリ領域について解説します。
続きへドゾー
まず皆さんRGBというワードを聞いたことありますか?
Red Green Blue の頭文字をつなげた言葉です。
RGBは色を数値で表します。

例えばRを255(0xFF)としGとBを0(0x00)とするなら 0xFF0000 で赤い色を表します。
同様にGが255(0xFF)でRとBが0(0x00)なら 0x00FF00 で
Bが255(0xFF)でRとGが0(0x00)なら 0x0000FF でです。
そしてR、G、B各色255(0xFF)ならば 0xFFFFFF で "白"です。
R,G,B各色0(0x00)ならば 0x000000 "黒"になります。

さらにアルファ値というものもあったりして(これで透過処理できたりするわけですが次回に)よくAで表します。
あまり詳しくないんですけどね。並びはRGBAです。
pixel_image


そしてVRAMはフレームバッファと呼ばれる領域に区切られます。
フレームバッファは仮想画面とイメージして下さい。
このフレームバッファは表(表示)と裏(描写)と二つ(2枚?)あり、これを交互に表示させています。
つまり表を表示している間に裏に書き、フレームバッファを入れ替えるAPIを呼ぶことで表裏が入れ替わります。
フレームレートやFPS(frame per second)として一秒間に表裏が入れ替わる時間を表します。

それでフレームバッファはこのRGBという数値がずらーーーーっと並んでいるとイメージして下さい。
pixel_image2

そして一つのRGB値で1ピクセルと対応します。
フレームバッファ先頭アドレスはPSPの画面左上ピクセルとなります。
このフレームバッファ先頭アドレスは取得するAPIが用意されています。
ちなみにVRAMは0x04000000から0x041FFFFFの2MBあります。

それで1つのフレームバッファのサイズは 512 x 272 x ピクセルサイズ です。
ピクセルサイズとはすなわちRGBのサイズです。
PSPでは、RGBを32bit(4byte)として扱うモードと16bit(2byte)として扱うモードがあります。
32bit(4byte)の場合を8888と表し、RGBA各8bitまで扱えます。つまり0 ~ 255(0x00 ~ 0xFF)まで扱えます。

16bit(2byte)は3つモードがあり、RGBの各色が扱える色の幅が違います。
・4444  RGBA各4bit使用 0 ~ 15 (0x0 ~ 0xF)
・5551  RGB各5bit使用 残り1bitはアルファ値 0 ~ 31 (0x00 ~ 0x1F)
・565   R5bit, G6bit, B5bit 使用 R,B 0 ~ 31(0x00 ~ 0x1f) , G 0 ~ 63 (0x00 ~ 3F)

ここで1つのフレームバッファのサイズを出すと
32bit(4byte)の場合  512 x 272 x 4 = 557056 です。16進数で 0x88000 です。
16bit(2byte)の場合  512 x 272 x 2 = 278528 です。16進数で 0x44000 です。

さて大体イメージはつかめたでしょうか?

ではC言語でのコーディングに移る前に一つ。
PSPはリトルエンディアンです。
つまりRGBAが逆転してABGRとなります。
pixel_image3

32bit 8888の場合
赤は 0xFF0000FF
緑は 0xFF00FF00
青は 0xFFFF0000
となります。

RGBからの各色の取出しは以下のようにできます。

32bit 8888の場合
unsigned long rgba = 0xFF7F7F7F;
unsigned char r, g, b, a;

r = rgba & 0xFF;
g = rgba & (0xFF << 8);
b = rgba & (0xFF << 16);
a = rgba & (0xFF << 24);


16bit 4444の場合
unsigned short rgba = 0xF777;
unsigned char r, g, b, a;

r = rgba & 0xF;
g = rgba & (0xF << 4);
b = rgba & (0xF << 8);
a = rgba & (0xF << 12);


16bit 5551の場合
unsigned short rgba = 0xBDEF;
unsigned char r, g, b, a;

r = rgba & 0x1F;
g = rgba & (0x1F << 5);
b = rgba & (0x1F << 10);
a = rgba & (0x01 << 15);


16bit 565の場合
unsigned short rgba = 0x3E0F;
unsigned char r, g, b;

r = rgba & 0x1F;
g = rgba & (0x3F << 5);
b = rgba & (0x1F << 11);


今回はここまでにしましょう。
スポンサーサイト
Comment
RGBからの各色の取出しについて
rはいいと思うんですが、gbaは右シフトしてやらないとだめだと思います…。

例えば32bit 8888の場合を例に挙げると
g = (rgba & (0xFF << 8)) >> 8;
b = (rgba & (0xFF << 16)) >> 16;
a = (rgba & (0xFF << 24)) >> 24;
みたいな感じかと。

ケチつける感じのコメントになってしまいましたが、
勉強になる部分も多々あるので応援してます。
Trackback
Trackback URL
Comment Form
管理者にだけ表示を許可する
Twitter...A

estuibal=Y.K < > Reload

検索フォーム
RSSリンクの表示
リンク
QRコード
QR
ブロとも申請フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。