PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

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

[edit]

CM: --
TB: --

page top

2009年10月25日、ようやく間違いを訂正。 下の RGB( ) の計算式の閉じカッコが一文字抜けてました。
2010年01月10日、また間違いを訂正。 PSPSDK での int は、32ビット値(固定)です。今まで放置していてご迷惑をおかけしました。


さて、いよいよ お楽しみのグラフィック描画にチャレンジします。
まず今回は、PSPのグラフィック・ビデオRAM(V-RAMとも呼ばれます)を 32ビットカラーモードで点を打つ際の基礎からレッスンです。
これを理解すれば、V-RAMに線を引いたり四角枠や円を描いたり、塗りつぶし長方形や塗りつぶし円を描いたりする事が出来ます
(円を描く際は、数学のSin・Cos等の関数を用いて演算処理をして描画します→CPUでV-RAMに描画する場合であり、GPU描画を行なわない場合)。

 まず、32ビットカラーとは4バイトの値です。実際には現在のパソコンと同じく 24ビットカラー(最大1677万7216色)の表現が出来ますね。
 24ビットカラーと32ビットカラーの違いは、本当は24ビットカラーであり32ビット中 上位8ビットがカラッポの正味24ビットの値でありPSPのような32ビットCPU系では32ビット単位で扱うと楽チンな値でもあります。

 で、32ビットは4バイトなのでキャスト(型宣言)は long を使うと良いでしょう。 int でも良いのです。


 以下、PSPにおける、32ビットカラー(本質24ビットカラー)の割り当て配分表を書いてみます。

ビット  桁

 32 : 8    ↑
 31 : 7    |
 30 : 6    |
 29 : 5    |
 28 : 4 無効なビット(常にゼロ) +3バイト目 (オフセット値3)
 27 : 3    |
 26 : 2    |
 25 : 1    ↓

 24 : 8       
 23 : 7    
 22 : 6    
 21 : 5    
 20 : 4   青成分  +2バイト目 (オフセット値2)
 19 : 3    
 18 : 2    
 17 : 1       

 16 : 8       
 15 : 7    
 14 : 6    
 13 : 5    
 12 : 4   緑成分  +1バイト目 (オフセット値1)
 11 : 3    
 10 : 2    
 09 : 1       

 08 : 8       
 07 : 7    
 06 : 6    
 05 : 5    
 04 : 4   赤成分  +0バイト目 (オフセット値0)
 03 : 3    
 02 : 2    
 01 : 1       


↑↑ 縦長で見づらいかも知れません。ごめんなさい。

青、緑、赤は、それぞれ 8ビット長(1バイト)です。
値は、10進数で 0~255、16進数で 0x00~0xFF の範囲です。

これは、とても計算しやすいかと思いますが、どうですか?

例を挙げると、
青色を指定する際は、コード 0x00FF0000 を渡します。
緑色を指定する際は、コード 0x0000FF00 を渡します。
赤色を指定する際は、コード 0x000000FF を渡します。
と なります。

この時、良く考えてみると、
点を打つ V-RAMアドレスからの距離 赤は+0   (オフセット値==0)
点を打つ V-RAMアドレスからの距離 緑は+1   (オフセット値==1)
点を打つ V-RAMアドレスからの距離 青は+2   (オフセット値==2)
点を打つ V-RAMアドレスからの距離 ダミーは+3 (オフセット値==3)

となるので、仮にPSPの 左上( 0, 0) のV-RAMアドレスの先頭は 0x44000000 なので

0x44000000: 赤成分
0x44000001: 緑成分  (x,y)=(0,0)
0x44000002: 青成分
0x44000003: カラッポ
0x44000004: 赤成分
0x44000005: 緑成分  (x,y)=(1,0)
0x44000006: 青成分
0x44000007: カラッポ
0x44000008: 赤成分
0x44000009: 緑成分  (x,y)=(2,0)
0x4400000A: 青成分
0x4400000B: カラッポ

となるのですが、キャスト(型宣言)long 若しくは int で定義した値で座標(0,0)に色の点を 打つなら、

0x44000000: (long) 空青緑赤

の構成で点が打たれます。まぁ、こういう難しい事は考えずに、long 定義の値で そのままV-RAM書き込みしてやれば良いとだけ記憶しておいて下さい。 ノシ


色のコード対応表とかは、続きに記載する事にします。興味ある人は読んで下さい。
#define でカラーコードを定義して、プログラム中で使えるようにしています(コピペ対応)。

→ PSPプログラミング - 32ビットカラーで描画しよう!その1(後編 / 座標) へ続きます。
今回はダウンロード物はありません。
コピペできる物だけ あります。


以下は、全角文字表示ライブラリの mh_print( ) 関数用のヘッダーファイルに追加でコピペして下さい。
"zenkaku.h" 内への貼り付け推奨です。
また、mh_print( ) 関数 を呼び出している全てのプログラムソースにインクルードすると吉かもっ。

/***************************************************************************
* PSPプログラマー向けに、32ビット色コードを英語と日本語表記で定義してみる *
***************************************************************************/


#define BLACK 0xFF000000 // 黒色   ■■■■■■■■
#define BLUE 0xFFFF0000 // 青色   ■■■■■■■■
#define RED 0xFF0000FF // 赤色   ■■■■■■■■
#define GREEN 0xFF00FF00 // 緑色   ■■■■■■■■
#define DARKBLUE 0xFF800000 // 紺色   ■■■■■■■■
#define LIGHTBLUE 0xFFFA0000 // 水色   ■■■■■■■■
#define BROWN 0xFF404080 // 茶色   ■■■■■■■■
#define PINK 0xFFFF80FF // 桃色   ■■■■■■■■
#define DARKGREEN 0xFF008000 // 深緑色  ■■■■■■■■
#define YELLOGREEN 0xFF00FF80 // 黄緑色  ■■■■■■■■
#define PURPLE 0xFFFF0080 // 紫色   ■■■■■■■■
#define ORANGE 0xFF4080FF // 橙色   ■■■■■■■■
#define LEMON 0xFF80FFFF // レモン色 ■■■■■■■■
#define YELLOW 0xFF00FFFF // 黄色   ■■■■■■■■
#define SKYBLUE 0xFFFFFF00 // 空色   ■■■■■■■■
#define PEARLORANGE 0xFF75BAFF // 肌色   ■■■■■■■■
#define GRAY 0xFF808080 // 灰色   ■■■■■■■■
#define SILVER 0xFFC0C0C0 // 銀色   ■■■■■■■■
#define GOLD 0xFF20C0E6 // 金色   ■■■■■■■■
#define WHITE 0xFFFFFFFF // 白色   □□□□□□□□


#define KURO_IRO BLACK // 黒色   ■■■■■■■■
#define AO_IRO BLUE // 青色   ■■■■■■■■
#define AKA_IRO RED // 赤色   ■■■■■■■■
#define MIDORI_IRO GREEN // 緑色   ■■■■■■■■
#define KON_IRO DARKBLUE // 紺色   ■■■■■■■■
#define MIZU_IRO LIGHTBLUE // 水色   ■■■■■■■■
#define CHA_IRO BROWN // 茶色   ■■■■■■■■
#define MOMO_IRO PINK // 桃色   ■■■■■■■■
#define FUKAMIDORI_IRO DARKGREEN // 深緑色  ■■■■■■■■
#define KIMIDORI_IRO YELLOGREEN // 黄緑色  ■■■■■■■■
#define MURASAKI_IRO PURPLE // 紫色   ■■■■■■■■
#define DAIDAI_IRO ORANGE // 橙色   ■■■■■■■■
#define USUKI_IRO LEMON // レモン色 ■■■■■■■■
#define KI_IRO YELLOW // 黄色   ■■■■■■■■
#define SORA_IRO SKYBLUE // 空色   ■■■■■■■■
#define HADA_IRO PEARLORANGE // 肌色   ■■■■■■■■
#define HAI_IRO GRAY // 灰色   ■■■■■■■■
#define GIN_IRO SILVER // 銀色   ■■■■■■■■
#define KIN_IRO GOLD // 金色   ■■■■■■■■
#define SHIRO_IRO WHITE // 白色   □□□□□□□□

// 32ビットカラーの16進数コードを RGBから作成する計算式
#define RGB(r,g,b) (((long)b<<16)|((long)g<<8)|((long)r)) // ← 閉じカッコが一文字抜けていました
// 10パーセント単位で指定する際の定義。
#define P100 255 // 100% 最大 MAX
#define P90 229 // 90%
#define P80 205 // 80%
#define P70 179 // 70%
#define P60 152 // 60%
#define P50 127 // 50% 半分 2分の1
#define P40 102 // 40%
#define P30 77 // 30%
#define P20 51 // 20%
#define P10 25 // 10%
#define P0 0 // 0% 無し ZERO

// 4分割単位で指定したい時のために記述。
#define P75 191 // 75% 3/4 4分の3
#define P25 63 // 25% 1/4 4分の1



mh_print( ) 関数 の使用例を記述してみます。
[ 部分抜粋なので、見るだけの程度で お願い ]
以下

#include "zenkaku.h"

int main(int argc,char **argv)
{

/* Gu初期化 32ビットカラーモード */
sceGuInit();
sceGuStart(GU_DIRECT, list);
sceGuDrawBuffer(GU_PSM_8888, SCRBUF0, BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH, SCR_HEIGHT, SCRBUF0, BUF_WIDTH);
sceGuFinish();
sceDisplayWaitVblankStart();
sceGuDisplay(GU_TRUE);

mh_print( 0, 0, "Hello,world !", WHITE); // 白色
mh_print( 65, 14, "やったぜ、加トちゃん!!", RGB( P100, P75, P10); // 赤100% 緑75% 青10% の配合色
mh_print( 19, 35, "Здравствуйте !", SILVER | AO_IRO ); // 銀色と青色の合成色
mh_print( 128, 52, "い出よ、神龍!", (MIZU_IRO | RGB( P10, P25, P80)); // 水色と、赤10% 緑25% 青80% の合成色
mh_print( 200, 77, "オレンジはぁ~橙色なのさぁ~~~~", ORANGE | LEMON | BROWN ); // 橙 薄黄 茶 の合成色

以下略。


各定義された色を、OR演算子 → | で合成するとか、パーセント配合してみるとかで
混ぜると複雑な色になります。何しろ、1677万7216色 表現 が出来るので……。

色コードは、ダイレクトに 0xF1942E とかの16進数の数値で指定しても良いですね。


ヒマがあったら、各自レッスンしてみて下さい。

実際に、PSPで表示してみないと どんな色になるかは解からないのがツボwwwwww


関連記事
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

この記事に対するコメント

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/94-933c06c9
この記事にトラックバックする(FC2ブログユーザー)

page top


h o m e |


 

2017-03