2009-04-21
20年前の2000倍速で光を追って - MSXのレイトレーシングプログラムをC#に移植する -
PG | |
![]()
前から読んでみたかったんですけど、なかなか入手できなかったんですよね。
温故知新っていうまではいかなくても、何らかのインスピレーションが得られたらいいなと、昔の雑誌を読んでみようと思ったのです。
Oh!Xの表紙絵は、CG使ってるのが多いみたいです。
この時代のCGって、いかにもCGっていう感じがしますよね。
CGくさい感じも、今となってみると、これはこれで良いかなと思うんですよ。
そんなことを考えていたら、なんかレイトレーシングがやりたい気分になったんですよ。
レイトレで思い出したのが、下の本です。
この本は、名著だと思います。
高校生のときに、とてもワクワクしながら読みましたよ。
MSX1は、色数がたしか16色。
MSX2では、256色とか出るようになり。
MSX2+になると、自然画モードというのが追加されて1万9千色を出せるようになりました。
この本では、MSX2+の自然画モードを生かして、レイトレーシング法でCGを描画するプログラムが掲載されています。
リストは以下のような感じです。
リストはもっと続きがありますが、これは最初のページだけです。
MSXのCPUは、ザイログのZ80というやつで、クロック周波数はおよそ3MHzです。
これでレイトレをやるのは、かなり無理があります。
本文には、図形3つのシーンを描画し終わるまでの時間が書いてあります。
べーしっ君という名前のBASICコンパイラを使うと、3時間で、素のBASICの場合だと、16時間!だそうです。
このMSX-BASICで書かれたプログラムを、C#に移植してみることにしました。
なにを今更と思われるかもしれませんが、これがなかなか面白かったですよ。
昔のBASIC言語には、以下のような特徴(というか欠点)があります。
- グローバル変数しか使えない
- 関数を自分で作れない(けど、サブルーチンというのがある)
- なので、どれが引数なのかがパッと見では分からない
- 変数名に長い名前を使えない(使っても最初の2文字以外は無視とか)
そのままベタ移植しただけだと、C#らしいプログラムにはならないわけです。
1文字か2文字の変数名の意味を推測して、ちゃんと意味が通る変数名に直したり、
グローバル変数を使わないように、変数のスコープを考えて、ローカル変数やパラメータ変数に直したりしました。
パズルを組み立ててる感覚です。
さらに、オブジェクト指向っぽく、プログラムの構造を直しました。
こういうCGを扱うプログラムって、オブジェクト志向と親和性が良いと思うんです。
以前に自前ポリゴンエンジンを作ったときも、そんな印象を受けました。
資格試験の問題に出てくるような、オブジェクト指向で書かれた自動販売機プログラムみたいな、ムリヤリ感が無いというか。
これはなかなか、プログラミングの良い勉強になりますね。
自分の会社が、ゲーム会社とかだったら、新人研修の課題にしてたかもしれません。
一応出来上がったプログラムで、生成したのが以下の画像です。
解像度を元のプログラムから上げてあります。
それと、C#のdouble型で計算してるので、MSX-BASICの実数型よりずっと精度が高くなっています。
いかにもCGっぽいのが私的には良い感じです。
思ってたよりキレイなCGが生成できて、面白いです。
(でも、なんか写りこみ方がなんか変かも?バグってるのかな?)
20年前のMSXパソコンでは16時間かかってたものが、解像度を上げても30秒ほどで計算完了します。
16時間 / 30秒 = 1920倍
なので、今のPCでは、1920倍の速度でレイトレーシングの計算ができました。
およそ2000倍速です。
16時間待ってた当時の人は、素直にスゴイなあと思います。
意気込みがちがいますよね
- 6 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP321JP321&q=C#+自動販売機プログラム
- 5 http://reader.livedoor.com/reader/
- 3 http://blogsearch.mobile.yahoo.co.jp/p/blogsearch/list/view?p=ファミコンエミュレータ&b=11&so=dd
- 2 http://images.google.co.jp/imgres?imgurl=http://f.hatena.ne.jp/images/fotolife/a/aoisome/20080915/20080915000234.png&imgrefurl=http://d.hatena.ne.jp/aoisome/?of=5&usg=__AJ3M0I1Z57CumhyirEtKerlz9Pw=&h=587&w=556&sz=209&hl=ja&start=14&sig2=vEpAM4NL3Zl80H
- 2 http://search.hatena.ne.jp/search?word=ファミコン エミュレータ&site=d.hatena.ne.jp
- 2 http://search.yahoo.co.jp/search?p=C言語課題 新人研修&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=0&oq=
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&channel=s&rls=org.mozilla:ja:official&q=プログラマ新人 人日 作業量&btnG=検索&lr=
- 1 http://azby.search.nifty.com/websearch/search?cflg=検索&select=41&q=仕事+工数&ck=&ss=azby_top_tp
- 1 http://blog.search.goo.ne.jp/search_goo/result/?ts=all&tg=&st=&dc=&dp=&da=&MT=msx
- 1 http://d.hatena.ne.jp/keyword/C#




3時間まってた当時の人です。
べーしっ君使うと、単精度になってたんですよねー
なつかしい
私がMSXをいじってたのは1994年頃で、リアルタイムに経験したわけではなかった為、「べーしっ君」の「BASICコンパイラ」という言葉の響きにやたら憧れた記憶があります。
今回つくったプログラムでは、出力が得られるまでが早いので、キレイな感じに見えるパラメタを探すのがすごく楽でした。
何時間もかかるとなると、何度も試すのはしんどいですもんねー。