Hatena::ブログ(Diary)

Aoisomeの以下略 このページをアンテナに追加 RSSフィード

2009-04-21

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

| 23:23 | 20年前の2000倍速で光を追って - MSXのレイトレーシングプログラムをC#に移植する -を含むブックマーク 20年前の2000倍速で光を追って - MSXのレイトレーシングプログラムをC#に移植する -のブックマークコメント

1990年頃のOh!Xをオークションで落札しました。

前から読んでみたかったんですけど、なかなか入手できなかったんですよね。

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

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

この時代のCGって、いかにもCGっていう感じがしますよね。

CGくさい感じも、今となってみると、これはこれで良いかなと思うんですよ。

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

レイトレで思い出したのが、下の本です。

f:id:aoisome:20090421224345j:image

この本は、名著だと思います。

高校生のときに、とてもワクワクしながら読みましたよ。

MSXというコンピュータの規格が昔あったんです。

MSX1は、色数がたしか16色。

MSX2では、256色とか出るようになり。

MSX2+になると、自然画モードというのが追加されて1万9千色を出せるようになりました。

f:id:aoisome:20090421224346j:image

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

リストは以下のような感じです。

f:id:aoisome:20090421224347j:image

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

MSXCPUは、ザイログZ80というやつで、クロック周波数はおよそ3MHzです。

これでレイトレをやるのは、かなり無理があります。

本文には、図形3つのシーンを描画し終わるまでの時間が書いてあります。

べーしっ君という名前のBASICコンパイラを使うと、3時間で、素のBASICの場合だと、16時間!だそうです。

このMSX-BASICで書かれたプログラムを、C#に移植してみることにしました。

なにを今更と思われるかもしれませんが、これがなかなか面白かったですよ。

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

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

そのままベタ移植しただけだと、C#らしいプログラムにはならないわけです。

1文字か2文字の変数名の意味を推測して、ちゃんと意味が通る変数名に直したり、

グローバル変数を使わないように、変数のスコープを考えて、ローカル変数パラメータ変数に直したりしました。

パズルを組み立ててる感覚です。

さらに、オブジェクト指向っぽく、プログラムの構造を直しました。

こういうCGを扱うプログラムって、オブジェクト志向と親和性が良いと思うんです。

以前に自前ポリゴンエンジンを作ったときも、そんな印象を受けました。

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

これはなかなか、プログラミングの良い勉強になりますね。

自分の会社が、ゲーム会社とかだったら、新人研修の課題にしてたかもしれません。

一応出来上がったプログラムで、生成したのが以下の画像です。

解像度を元のプログラムから上げてあります。

それと、C#のdouble型で計算してるので、MSX-BASICの実数型よりずっと精度が高くなっています。

f:id:aoisome:20090421224348j:image

いかにもCGっぽいのが私的には良い感じです。

思ってたよりキレイなCGが生成できて、面白いです。

(でも、なんか写りこみ方がなんか変かも?バグってるのかな?)

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

16時間 / 30秒 = 1920倍

なので、今のPCでは、1920倍の速度でレイトレーシングの計算ができました。

およそ2000倍速です。

16時間待ってた当時の人は、素直にスゴイなあと思います。

意気込みがちがいますよね

nowokaynowokay 2009/04/25 06:16 すごいキレイ!これがあのプログラムの出力結果なのか!
3時間まってた当時の人です。
べーしっ君使うと、単精度になってたんですよねー
なつかしい

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

uncle_counteruncle_counter 2014/04/24 09:17 あっ、その本、まだ持っています。本棚の奥に(⌒-⌒; )べーしっ君も持ってました。僕のMSX2だと4時間近く待ってた記憶があります*\(^o^)/*

トラックバック - http://d.hatena.ne.jp/aoisome/20090421/1240323804