#include "psl.h" using namespace wfl; using namespace psl; int main(void) { Start(); wfl::SetNumThreads(); //最大限にプロセッサコアを用いる //壁紙・物体位置 Point posWallpaper(0, 0, -100e-3); //壁紙はz=-100mmの位置 Point posObject(0, 0, -50e-3); //物体はz=-50mmの位置 //フレームバッファの設定 double px = 4e-6, py = 4e-6; //サンプリング間隔 int nx = 1024, ny = 1024; //サンプリング数 WaveField frame(nx, ny, px, py); //フレームバッファの位置は(x,y,0)面 frame.Clear(); frame.SetOrigin(posWallpaper); //フレームバッファの初期位置は壁紙の位置 //壁紙(背景)の設定 double width = 4e-3, height = 4e-3; //壁紙のサイズ WaveField wallPaper; wallPaper.LoadBmp("Checker(256x256).bmp", AMPLITUDE);//壁紙画像を壁紙光波の振幅とする wallPaper.SetPx(width / wallPaper.GetNx()); //壁紙の幅と一致するようサンプリング間隔を設定 wallPaper.SetPy(height / wallPaper.GetNy());//壁紙の高さと一致するようサンプリング間隔を設定 wallPaper.SetOrigin(posWallpaper); //壁紙の位置設定 //壁紙の光波を発生してフレームバッファに加算 WaveField wpFrame = frame; //壁紙用のフレームバッファ wpFrame.Clear(); wpFrame.ResamplingAdd(wallPaper, NEAREST_NEIGHBOR);//壁紙画像を補完して壁紙バッファに加算 //--以下は特殊な拡散位相を使う場合 //WaveField diffuser; //拡散位相 //diffuser.LoadWf("diffuser1024x1024.wf");//拡散位相読み込み //MultiplyDiffuser(wpFrame, diffuser); //壁紙画像に拡散位相の乗算 wpFrame.ModRandomPhase(); //通常は拡散位相を使わずに位相乱数化 frame += wpFrame; //フレームバッファに壁紙光波(壁紙バッファ)を加算 wpFrame.Dispose(); //壁紙バッファはもう必要ないので廃棄 frame.SaveAsWf("frame0.wf"); //デバッグ用にセーブ frame.ExactAsmProp(posObject.GetZ() - posWallpaper.GetZ()); //壁紙光波を物体平面まで伝搬. 位置はz=-50mmになる //物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadWrl("cube.wrl"); //読み込み model.Localize(); //物体を原点付近に置く model.SetWidth(2e-3); //外接矩形の横幅が2mmになるように物体サイズを設定 model += posObject; //物体モデルの位置設定 //シルエットマスク処理 PaintObjectSilhouette(frame, model); //シルエット部分を黒(0)に塗る frame.SaveAsWf("frame1.wf"); //デバッグ用にセーブ //シェーダーの設定 Vector light(-1.0, -2.0, -1.0); //照明光の方向 double env = 0.2; //環境光の割合 double gamma = 0.3; //補正制限値 TfbFlatShading flatShader(/*diffuser, */ gamma, light, env); //乱数位相でフラットシェーディング準備 // SurfaceBuilderの設定 SurfaceBuilder sb(frame); sb.SetDiffractionRatio(1.0); //回折率設定 sb.SetCullingRate(0.6); //カリング率設定 sb.SetShader(flatShader); //上で用意したシェーダーを組み込む //物体モデルmodelからの光波を計算してフレームバッファに加算 sb.AddObjectField(frame, model); frame.SaveAsWf("frame2.wf"); //デバッグ用にセーブ //フレネルホログラム用の物体光波を得るためホログラムの位置まで伝搬計算する frame.ExactAsmProp(0 - posObject.GetZ()); frame.SaveAsWf("frame.wf"); //ホログラム位置での物体光波 }