![](https://jhalfmoon.com/dbc/wp-content/uploads/2018/11/JH-2-150x150.png)
前回はホフスタッターQ数列でクロージャを学びましたです。今回は1ピクセル描画関数 draw-pixel の「重そうなデモ」ということで Graphics examples の Ray tracing を試行。@200MHzとはいえ uLispインタプリタで直列処理。360×240ピクセルの画面に出力するのに約11分。
※Lispと一緒 投稿順 index はこちら
※実機確認は Wio Terminal で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
レイトレーシング(光線追跡法)
光の反射、屈折、影などを表現できるレイトレーシングは、臨場感のあるグラフィクスを生成するのに適するアルゴリズムです。視点からの光線を光源などに向かって追跡していくので明解。お惚け老人にもわかりやすいアルゴリズムです。しかし、計算負荷が重いのも有名っす。そのかわり全てのピクセルの計算を同時並列に行っても(行えるものならやってみろ、ですが)OKなアルゴリズムなので並列化には最適。よって、GPUなど使ってガンガン計算するのが普通。
まあそんなレイトレーシングを、uLispの Graphics examples の中の以下のページでは、ちっこいマイコン上のuLispつかって健気にも実施してます。
上記のページ内にuLispで書かれたソースへのリンクがあるので、そのファイルをダウンロードして、手元の uLisp機にアップロードすれば、レイトレーシングできるようになります。なお、該当のソースを見たところ「世界」は
-
- 平面、plane
- 球、sphere
の2種類のオブジェクトをならべて記述せにゃならんようです。トップレベルの関数 ray-trace には、平面1枚、球が5個のモデルが記述されてます。 ray-trace 関数内で、視点 *eye* と 光源 *light* も規定されているので、この関数を書き替えたらお望みの世界?を描画できる筈。
まあ、ミニマムなレイトレーシングではあるけれど。
実行結果
Wio Terminal は画面が 360×240 ピクセルサイズなので、実行は以下のようにしました。なお、処理時間を測りたかったので time 関数使ってます。
(time (ray-trace 320 240))
描画結果が以下に。
よって
360×240 = 86400ピクセル
683.1秒 ÷ 86400ピクセル ≒ 1ピクセルあたり7.9 [ミリ秒]
という結果になりました。uLispにしちゃ、ヘビーな負荷?。いろいろ高速化の余地はありそうではありますが。