#02 DGEN 続メガドラガンマ(その2)
注意:ええと、きょーのはなしも、けーぞくせーが、つおいから、きのーの後半から、よんでね。
保護者の方へ:お子様の3日坊主の治療の為、前日と継続性の強い物となっております。「ファンタシースター」
はさりげなくお子様の手の届く場所へ保管してください。
<前回までのあらすじ>
メモリが訳ワカランと、メモリの改造が難しいので整理。(本当はこれが主題だった筈)
最大ROMが4MBytes(32MBit)で正しい事を確認する為。4MBytes(32MBit)の「ファンタシースター千年紀」
をPSPで起動、動作確認。
せっかく起動したんだから、遊ぶつ。
「あれつ。影がキタナイ、ダンジョンもキタナイ。黒がキツイ」
「メガドラガンマ」実装しないとだめぽ→(管理人のデビルアイを駆使し)実装。
(あんまりデビルシリーズを使いすぎると、管理人の正体が実はデビルマンである事がばれてしまうので、
程々にしておこう。ああっ!聞かれてしまったか。よいこのみんな。みんなには秘密だよ。)
ああつ。「サンダーフォースⅢのWAVEが、つよそーになつた」
でも、本物に比べて画質が眠すぎるう。これは、「CRT→液晶」の特性が考慮されてないから。
つー訳で、今日はPSPの液晶の話(の予定)
■PSPの液晶の色ガンマ値が、CRTと比べてずれてるなんて話は聞いた事ないだろ。
そんな事は、ないんだから、今日の話は「メガドラガンマ」(もちろんこのガンマは色ガンマ値)の話だけど、
「色ガンマ値」もっと言えば「PSP液晶の色ガンマ特性」の話じゃねーんだよ。
工学的な特性のみを追求してる、御方には「盲点」になってて、何の事やら想像もつくまい。(頭かたいつ)
ここは、液晶の話ではなくて、まずCRTの原理と工学特性。および「それ」の具体的実装。まで解らなければ、
話が見えない。
まず、メガドラが現役だった頃の「家庭用TV」つまり、「低解像度CRT」の話。
各社競って「色補正」をかけていたが、それは「本質」と関係がないので、考慮にいれない。
一画面に262ラスタ描画する。(非表示、戻り含む)
TVの調整によるが、画面に実際に映るのは240ラスタ前後。さしあたり240ラスタとする。
仮に20インチのTVだったとして、奇数フレームに走査線が半波ずれる事を考慮しても、
240x2で480ラスタしか、描かない。
PC用のディスプレイを思い出してくれ。(この場合は液晶でもCRTでも構わない)
20インチもあったら、1680x1200グライ映してもバチはあたらんだろ。
480ラスタと1200ラスタなら、縦解像度は2.5倍も違うだろ。
横はビームが滑らかに動いて描画していくから問題にならない。
だが縦解像度が2.5倍も違って、同じような画を写すのならば、ビームの径(直径だお)が、
2.5倍なければ、似たよーな画は出て込んだろ。
■「じゃあ2.5倍太けりゃ問題ないじゃん。」
甘いつ。
2.5倍太くするのは、工学的に無理つ。
CRTの後ろにどれくらいの電圧かけて電子ビームを飛ばしてるか知ってる?
画像が出ても、コントラスト比が低けりゃ、買う人いる?
電圧上げすぎれば、当然放電事故が発生するわな。CRTの周りに碍子でも設置して、
「危険物につき子供は立ち入り禁止。このCRTは20インチだけど、放電するので半径20M(メートル)は立ち入り禁止」
とでもするか?
無理なんだよ。性能が足りなけりゃ強化すれば良いという発想では土台無理。
フォーカス、甘甘に設定すると、ビームは太くなっても画面はぼけぼけになって、明るさがどんどん落ちるだろ。
理屈上。電子ビームを飛ばしてる電圧変わってないんだからさ。
それでも色々あってとにかく民生用(家庭用)のCRT(TV)の方がビームの径が太い。
でも、そんなに太い訳じゃないから、「隙間」ができる。この「隙間」を嫌って、倍密描画して隙間をなくしたのが、
プログレッシブTVとか、それの規格がクリアビジョンとか(多分)その手の奴。
ビームの径を太くして画質を確保するのは、物理的に不可能だから、そおいう技術が生まれた。
もし、低コストでビームの径を太くしてそれで問題ないのなら、そんな技術は生まれなかった。
■ながーーーーなが、書いちゃったけど、纏め。
低解像度CRTはビームの径に限界があるため、縦にスリット状の「隙間」がある。
この「隙間」は工学上はPOWERを補償すれば済む話であっても、
「人間の視覚特性の問題」が別口で発生するため、(注:隙間にはビームが当たらないので、得意の残像特性が使えない)
POWERを補償以外に、これを考慮しなければならない。
■ここまで書けば判るでしょ。後の周辺の細かい話は「想像」してくれ。それで殆どあつてるから。
(それでも疑問なら、調べろな。せっかくインターネット繋がってるんだから、活用よーせんと。)
で、今度はPC用の「家庭用ゲーム機エミュ」の話。
その走査線の隙間。ゲーセンのゲームでもあったし、家庭用TVでもある。
当然見た目が違うから、気になる奴は気になる。
メガドラの画面は320x240程度だが、PCのVGAは640x480だ。
当然その「走査線の隙間」を再現してみたくなる。
で、やってみた。が、上手くいかない。
幾多のエミュに「ラスタ抜き」モードがあるだろ。最近の輩はこいつを試してみて、
「何でこんな訳解からん画面モードがあるんじゃい。目茶目茶汚いだけで、存在価値ないやんけ、
実機の画質とも全然無関係やん」
って、思うはず。事実、各エミュが実装した「ラスタ抜き」モードは構造的に欠陥がある為。あまり意味はない。
ただし「場合に拠ってはいい感じになる」が、その為の(物理的)条件は厳しい。
ちなみに640x480で320x240のラスタ抜きを真似すると、とてつもなく暗い画面になり、
しかも隙間だらけで訳のわからん画質となる。とても本物の画質の「真似をした」とは思えない。
「真似」のレベルが低いんである。
次、じゃあ、二倍密の480じゃあ、縦解像度が足りないんだな。三倍密の縦720ドットや四倍密の960ドット。
5倍密の1200ドットで、「真似」を試せばいいじゃないか。
世界は広いから現実に実行した人はいるし。それに対応してるエミュもある。効果は解像度が高い程、真似の
精度も高い。ただし「それ」用に考慮したプログラムを組んだ場合。
■前項の「それ」ってなあに?
「それ」を理解する為には、またCRTの仕組みに立ち返らないと、イケナイ。
「家庭用TVとPCのディスプレイって、電子ビーム飛ばしてる電圧。殆ど、一緒何でしょ?」
「工学的に殆ど一緒なのに、なんで全く一緒。じゃないの?」
「同じような物があるなんて、場所の無駄だよ」
こういう疑問を持った事はないかな?。
殆ど同じようなもの。なのだから、同じ。だったら、どこかの企業が「抜け駆け」して、
「家庭用TV(おまけ機能でPCが映ります)」あるいは、
「PC用CRT(おまけ機能で家庭用TVが映ります)」
こういう物があってもおかしくない。現に家庭用コンピューターが「MSX」とか「X1」とか「FM77AV」とか
320x240レベルの低解像度であった時代は、こういう商品が存在した。
しかし、640x480の解像度の時代では、この手の「商品」は、
「(おまけ機能)→(追加機能)」へと移行し、特殊な需要では存在するものの値段が高い。
という状態になった。もしくは「スキャンコンバーター」を追加し画像信号自体を変換する。という時代になった。
■「工学」というのは、「技術」だけではなくて、「コスト」も重要な要素である。
「技術」的にはすごいが、「コスト」もすごく高いというのは、既に「工学」ではない。
「工学」はその基本姿勢として、
1.「技術」は使えるだけ使う。
2.「コスト」は下げられるだけ下げる。
3.「性能」は妥協出来る所まで妥協する。
4.「営業?」そんなの知ったことか、需要があれば売れるし、需要があっても「宣伝」しなきゃ売れない。
それは専門の部署を配置して、一切任せるから、「工学」には入れないでくれ。
という事。注意して欲しいのは(3)。PSPだってDSだって、(3)が基本姿勢だって事、お忘れなく。
■だいぶ前の「それ」の説明が、まだ足りてないな。
「それ」を理解するためにはCRTの仕組みに立ち返らなければいけない。
「ビームの径を太くする第二の方法」がある。
硯に墨を磨って、お習字をする事にしよう。最近の子供も「習字」が必須科目だから、習字道具一式持ってる
だろ?業者がもうける為に。(あ、つい一言余計なこの口がぁ。ううう、デビルマウス嫌い)
よし、そろそろ硯に墨が擦れたかな?
バカ。水入れて擦る奴があるか、そんな事してたら、習字の時間が終わっちゃうだろ。墨汁から擦るんだよ。
そんなの子供の常識だよ。
ガンガレ。そうそう。一生懸命擦れ。管理人(正体はデビルマン)も応援してるぞ。ガンガレ。習字の時間が
終わりそうになつたら、次回の為に、墨汁の容器に戻すんだぞ。容器の口を上に向けて腹を押しそのまま
すばやく擦った墨汁に突っ込んで、逆流させ、全部吸わせろ!充実したいい時間だったろ?次回はもっと
濃くする事にチャレンジせよ。一年後の墨汁の成長が楽しみだ。
ええと、自分の擦った墨汁はもったいないから、隣の奴ので、実験しろ。ええと洗ってあげるとか、一見親切そ
うな台詞を口にすれば良い。習字の時間も終わりだから、その辺に失敗作が転がってるだろ。そうそう、それ
ごみばこから、そいつを持って来い。だめだめ。そんな丸めた奴は、ぐしゃぐしゃで書きにくいから却下。端っこの
折れてるそいつ、それそれ。
さて、やっと実験の材料がそろつた。
■ピンポーン。番組の途中ですが、CMにゃん。昨日の、をちと変えたにゃん。
#if 1
/* メガドラガンマ、テスト実装b */
int blue;
int red;
int green;
blue =((cram[i+1]&0x0e)<<2); blue =blue +blue +blue ; blue +=87;
red =((cram[i+1]&0xe0)>>2); red =red +red +red ; red +=87;
green =((cram[i ]&0x0e)<<2); green =green +green +green ; green +=87;
*ptr++ =( ((blue )>> 3)&(0xf8>> 3)) | /* ここはマスク要らない */
( ((red )<< 2)&(0xf8<< 2)) |
( ((green)<< 7)&(0xf8<< 7));
#endif
はOKにゃんけど、
#if 1
/* メガドラガンマ、テスト実装c */
int blue;
int red;
int green;
blue =((cram[i+1]&0x0e)<<2); blue =blue +blue +blue ; blue +=87;
red =((cram[i+1]&0xe0)>>2); red =red +red +red ; red +=87;
green =((cram[i ]&0x0e)<<2); green =green +green +green ; green +=87;
*ptr++ =(
(
( ((blue )>> 3)) |
( ((red )<< 2)) |
( ((green)<< 7))
)
&
(
(0xf8>> 3)|
(0xf8<< 2)|
(0xf8<< 7)
)
);
#endif
は駄目。問題の本質がすこし見えてきたにゃ。
(文責:ねこ、CMは15秒でおしまいにゃん)
■2本目のCMにゃん。人気番組、特にゲーム&アニメ関係はCMが一本じゃないんにゃよ。
そんなの、子供の常識にゃん。
ええと、メガドラガンマは、パックド演算で考えるなら、3回足すのではなくて、一回引く方向で考えなければ、
オーバーフローして隣の値に影響を受ける(つまり壊す)から駄目という事にゃん。にゃーんか、昔MMXの
パックド演算で似たような事で嵌った記憶があるにゃん(その場合は、飽和演算を使う)デビルマンでんでん、
成長してにゃいにゃん。だめぽ、にゃん。
(文責:ねこ、CMは15秒でおしまいにゃん)
■3本目のCM!!ぐあーっ今気がついたあー。昨日の最後の擬似パックド演算。
grb = ((10<<10)|(10<<5)|(10));
じゃなくて、
grb += ((10<<10)|(10<<5)|(10));
だろ!!上手くいく訳ねー。しかしここ直しても「オーバーフロー問題」が解決しないとむだぽ。
(文責:デビルマン、CMは15秒でおしまいだぎゃ)
■4本目のCM!!!!!!!!(C)ドラゴンボール、鳥山明。
と、おもったら、論理をすっかり変えたのわすれてたつ。死んでしまうとはなさけない。なんと、うまくいきやがった。そーすは、
#if 1
/* メガドラガンマ、擬似MMX風(パックド演算)、実装 */
int grb;
grb =((cram[i ]&0x0e)<<9)|((cram[i+1]&0xe0) )|((cram[i+1]&0x0e)>>1);
/* -ggG GGrr RRRb bBBB 7:7:7=0x1ce7 */
grb =grb +grb +grb ;
// grb = ((10<<10)|(10<<5)|(10)); /* 10==31-21==31-(3*7)==[0001_1111]-(3*[0000_0111]) */
grb += ((10<<10)|(10<<5)|(10)); /* 7*3=21=0x15=[0001_0101], [0001_0101]+[0000_1010]==[0001_1111] */
/* -GGG GGRR RRRB BBBB grb=555 */
/* -ggg --rr r--b bb-- 0x739c */
*ptr++ =( grb & 0x739c ); /* */
#endif
頭の硬い奴には理解できんじゃろ。intはunsigned shortにしても、全く同じ。
ぐわー美味く逝ったじぇー。(註:上手くいった)
ええっ?もう15秒?
(文責:デビルマン、翼の調子も良いようだ)