『昼夜逆転』工作室
[トップページへ戻る]

C# レイトレーシングと減色のテスト

2017年9月
C#でレイトレーシングのレンダラを書いた。単に球体を1つ描くだけのもの。目的はここから。いかにして減色するか。 ということで、オーダードディザ(Bayer配列に基づいた減色)と誤差拡散ディザ(Floyd-Steinberg ditheringに基づいた減色)を実装した。

プログラム

ダウンロード RayTracingTest.zip

プログラム

いまどきのPCなら3DCGの描画はライブラリ呼び出してシェーディング設定して一発。わざわざレイトレーシングのコードなんぞ書く必要はないだろう。 しかし、そうではない環境(例えばワンボードマイコン+モノクロ液晶画面)でこんなモノを表示してみたいと思ったら自力でコードを書くしかない。
レイトレーシングに限らず3DCGは基本的にベクトル計算で処理する。 C#には「Vector3」という、(x,y,z)成分を扱える構造体が定義されている。 ありがたいことに、内積や単位ベクトル化などのメソッドまであるので、もとの数式を比較的自然な形で書ける。 しかもハードウェアアクセラレーションをサポート。さすが、いまどき。描画は一瞬だ(i5、上記画像で1秒未満)。

描画結果

左から「減色なし」「配列ディザ」「誤差拡散ディザ」。減色後はRGB各2階調(0x00か0xFF)、すなわち8色で描かれている。
元の球体はオレンジ色なのだが、減色後は黄色っぽく見えてしまう。これは、オレンジ色が赤色・黄色の分布で表現されたところ、 赤色より黄色の方が輝度が高く、人の目には赤色がかき消されてしまうからだと思う。
試しに画像をぼかしてみると(中間色が生成され)期待通りのオレンジ色に見える。ということで計算上は間違っていないだろう。

描画結果
▼ぼかし加工
描画結果

グレースケール画像は2値化される。白っぽく見えるのは上記同様の理由だろう。 これも、ぼかしてみると期待通りの灰色になった。
描画結果

◆ ◆ ◆

上でも触れた通り、マイコン+モノクロ画面でレイトレーシングをやってみようと思い、まずはPCで描画と減色を実験した。 マイコンの開発環境にVector3構造体はないが、特に苦労せず移植できるのではないかと思う。

▼後日。マイコンでレイトレーシングの結果
 (ATmega328P/1MHz、96x64ドット、描画時間は約100秒)
マイコンでレイトレーシング マイコンでレイトレーシング


 
(C) 『昼夜逆転』工作室
[トップページへ戻る]