レイトレ作成開始
前回書いたビットマップ出力をリライトしつつレンダラの一番外側の枠を作った。
各ピクセルのリストにmap関数でray_shooting関数を適用するとRGBAのリストになるという寸法。
処理の本体たるrenderer:rayshooting/1はただのスタブで常にRGBA(0,0,0,0)を返す。
-module(dib32). -export([write_file/4]). % RAWデータをファイルに出力する write_file(F, W, H, RAW)-> {ok, IO}=file:open(F, [write]), io:put_chars(IO, [ [create_header(W, H), RAW] ]), file:close(IO). % ビットマップヘッダ create_header(W, H)-> [create_BITMAPFILEHEADER(W, H), create_BITMAPINFOHEADER(W, H)]. % BITMAPFILEHEADER create_BITMAPFILEHEADER(W, H)-> ["B", "M", toDWORD(14+40+W*H*4), [0, 0], [0, 0], toDWORD(54)]. % BITMAPINFOHEADER % 一箇所修正 4 -> 32 create_BITMAPINFOHEADER(W, H)-> [toDWORD(40), toDWORD(W), toDWORD(H), toWORD(1), toWORD(32), toDWORD(0), toDWORD(W*H*4), toDWORD(0), toDWORD(0), toDWORD(0), toDWORD(0)]. % DWORD toDWORD(N)-> toByte(4, N, []). % WORD toWORD(N)-> toByte(2, N, []). % 整数を指定バイト数にばらす toByte(0, _, L)-> lists:reverse(L); toByte(N, V, L)-> toByte(N-1, V div 256, [V rem 256|L]).
-module(renderer). -export([rendering/3]). -import(dib32). % 指定サイズでレンダリングして保存する rendering(F, W, H)-> dib32:write_file(F, W, H, lists:map(fun(XY) -> ray_shooting(XY) end, pixel_samplering(W, H))). % 指定されたピクセルにレイを飛ばしRGB値を得る(スタブ) ray_shooting(XY)-> [0,0,0,0]. % 幅と高さを指定してピクセル座標の配列を取得する pixel_samplering(W, H)-> [{X, Y}||X<-generate_list(W), Y<-generate_list(H)]. % 0からN-1のリストを作る generate_list(N)-> generate_list(N-1, []). generate_list(0, L)-> [0|L]; generate_list(N, L)-> generate_list(N-1, [N|L]).
116> renderer:rendering("tmp.bmp", 400, 300). ok
ここから画面出力を得るまでは長い道のりになりそうだと思ったらいいものを発見。
http://d.hatena.ne.jp/sumim/20070922/p1
100行くらいのrubyのレイトレース。
幸いrubyは読めるのでまずはこれを移植して動くものを作ろう。
で、並列 -> 分散 の嬉しさを味わえたら拡張していけばいいじゃない。