20年前の2000倍速で光を追って - MSXのレイトレーシングプログラムをC#に移植する -

1990年頃のOh!Xをオークションで落札しました。
前から読んでみたかったんですけど、なかなか入手できなかったんですよね。

温故知新っていうまではいかなくても、何らかのインスピレーションが得られたらいいなと、昔の雑誌を読んでみようと思ったのです。

Oh!Xの表紙絵は、CG使ってるのが多いみたいです。

この時代のCGって、いかにもCGっていう感じがしますよね。
CGくさい感じも、今となってみると、これはこれで良いかなと思うんですよ。

そんなことを考えていたら、なんかレイトレーシングがやりたい気分になったんですよ。
レイトレで思い出したのが、下の本です。

この本は、名著だと思います。
高校生のときに、とてもワクワクしながら読みましたよ。

MSXというコンピュータの規格が昔あったんです。
MSX1は、色数がたしか16色。
MSX2では、256色とか出るようになり。
MSX2+になると、自然画モードというのが追加されて1万9千色を出せるようになりました。

この本では、MSX2+の自然画モードを生かして、レイトレーシング法でCGを描画するプログラムが掲載されています。
リストは以下のような感じです。

リストはもっと続きがありますが、これは最初のページだけです。

MSXのCPUは、ザイログZ80というやつで、クロック周波数はおよそ3MHzです。
これでレイトレをやるのは、かなり無理があります。

本文には、図形3つのシーンを描画し終わるまでの時間が書いてあります。
べーしっ君という名前のBASICコンパイラを使うと、3時間で、素のBASICの場合だと、16時間!だそうです。

このMSX-BASICで書かれたプログラムを、C#に移植してみることにしました。
なにを今更と思われるかもしれませんが、これがなかなか面白かったですよ。

昔のBASIC言語には、以下のような特徴(というか欠点)があります。

  1. グローバル変数しか使えない
  2. 関数を自分で作れない(けど、サブルーチンというのがある)
  3. なので、どれが引数なのかがパッと見では分からない
  4. 変数名に長い名前を使えない(使っても最初の2文字以外は無視とか)

そのままベタ移植しただけだと、C#らしいプログラムにはならないわけです。
1文字か2文字の変数名の意味を推測して、ちゃんと意味が通る変数名に直したり、
グローバル変数を使わないように、変数のスコープを考えて、ローカル変数やパラメータ変数に直したりしました。
パズルを組み立ててる感覚です。
さらに、オブジェクト指向っぽく、プログラムの構造を直しました。

こういうCGを扱うプログラムって、オブジェクト志向と親和性が良いと思うんです。
以前に自前ポリゴンエンジンを作ったときも、そんな印象を受けました。

資格試験の問題に出てくるような、オブジェクト指向で書かれた自動販売機プログラムみたいな、ムリヤリ感が無いというか。

これはなかなか、プログラミングの良い勉強になりますね。
自分の会社が、ゲーム会社とかだったら、新人研修の課題にしてたかもしれません。

一応出来上がったプログラムで、生成したのが以下の画像です。
解像度を元のプログラムから上げてあります。
それと、C#のdouble型で計算してるので、MSX-BASICの実数型よりずっと精度が高くなっています。

いかにもCGっぽいのが私的には良い感じです。
思ってたよりキレイなCGが生成できて、面白いです。
(でも、なんか写りこみ方がなんか変かも?バグってるのかな?)

20年前のMSXパソコンでは16時間かかってたものが、解像度を上げても30秒ほどで計算完了します。

16時間 / 30秒 = 1920倍
なので、今のPCでは、1920倍の速度でレイトレーシングの計算ができました。
およそ2000倍速です。

16時間待ってた当時の人は、素直にスゴイなあと思います。
意気込みがちがいますよね