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)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで見て下さい