Cでレイトレーシング 1回

 

by ULproject for C (Windows)

 

レイトレーシングの仕組みや

式の意味、導出などは

N88-BASICでかんたんにレイトレーシング1回~8回

N88-BASICでかんたんにレイトレーシング1~8回

続編BASICでかんたんにレイトレーシング1回~7回

16回分の記事で紹介しています

 

今回はVL-BASIC用の

続編BASICでかんたんにレイトレーシング6回

のプログラムを

Cに移植しました

 

Cは入出力やテンポラリ変数が分かりやすくなっています

特にBASICではサブルーチンで使用している

テンポラリ変数(入出力以外に使用する変数)

を呼び出す側が意識する必要がありますが

Cでは関数の中で宣言した変数(ローカル変数と言い

関数の中だけで有効)を呼び出す側が意識しなくて

よく、入出力だけ意識すればよいので

簡単に呼び出すことが出来ます

 

また、このローカル変数のおかげで再帰呼び出しで

変数を退避させる必要がなく簡素に書くことができます

 

レイトレーシングの仕組みをより理解しやすいかと

思います

 

今回、変数の入出力を明確にするため

次のルールで関数を書いています

入力は

const有(中身の変更不可)ポインター型か通常変数

出力は

const無(中身の変更可能)ポインター型か関数の値

としています

 

static

int function(double* a, const double* b, int i)

{

}

functionという名の関数は

入力は、b(中身)とi

出力は、a(中身)とint型の関数値(戻り値)

です

aは入出力に使用できますが

今回は、出力専用にして、読みやすくしています

 

Windows用のプログラムは長くなりますので

GlutとOpenGLを使用してWindowと描画関係を

簡素にしています

 

ただし、CONSOLEアプリとWIN32アプリの

両方でコンパイルできるようにしてあり、

CONSOLEアプリの場合メインのWindowとは別の

文字表示用のCONSOLEウインドウが開きます

 

描画は

Gvramから始まる640x400x4bytesの

領域に点を描いて

OpenGLで転送表示しています

 

Gvram[0]~Gvram[3]の4bytesは

R,G,B,A(RGB0~255,A=0描画なしor255描画)

を意味し(0,399)の点を表します

Gvram[4]~Gvram[7]は(1,399)の点を表します

BASICのVRAMとはy座標が逆になっています

これはOpenGLの仕様に合わせています

 

Window関係はGlutがやってくれます

 

ray301.cのコンパイルには

Glut.h , Glut32.lib

が必要で

実行には

Glut32.dll

が必要です

GLUT(OpenGL Utility Toolkit)はサポートが終了

していて入手困難な場合は

GLUT互換のfreeglutが存在するらしいですので

こちらを試して見て下さい

 

どちらも、入手不可で、コンパイルなしで

実行する場合は

ray301.exe

を、実行して下さい

こちらは、GLUTを使用せずにコンパイル

しているため、

Glut32.dll

は必要ありません

(OpenGLを使用するためのdllは

Windowsに標準搭載だったはずなので

そのまま動くはずです)

 

操作できるキー

0,1,2,3,4、で動かす球の選択

9、で光源を水色の球内へ

↑,↓,←,→,/.\、で上下左右後前に動かす

( + shiftで移動量大 )

enter、で元の位置

q,w,e、で点の大きさ1,2,4

(点が大きいほうが荒いので速い)

 

続編BASICでかんたんにレイトレーシング7回

VL-BASIC拡張命令のレイトレーシング

(VL-BASIC付属サンプルのb/g6.bas)

より工夫していない分、動作速度は遅いですが

了承願います

 

ray301.c, ray301.exeを含む

etc30112.zip(etc~.zip)は

以下のリンクからダウンロードできます

VL-BASIC(N88-BASIC互換?)ホームページ

Readme.txtを読んで遊んで見て下さい