1.レイトレーシング
実装クラス:vec3、球体(ボール)、X線(放射線、光線方向ベクトル組成+の開始点からの放射)
camera.h hitable.h hitable_list.h
ray.cpp線の.h
sphere.h
vec3.h + vec3.cpp
ショー下図ツール:ffplay.exe
sphere.h
#ifndefのSPHEREH の#define SPHEREH の#include " hitable.h " クラス球:公共hitable { パブリック: 球(){} 球(vec3 CEN、フロートR):センター(CEN)、半径(R){} 仮想 ブールヒット(CONST光線&R、フロート TMIN、フロートTMAX、 hit_record&REC)CONST 。 vec3センター; フロート半径。 }。 ブール球::ヒット(constの光線&R、フロート T_MIN、フロート T_MAX、hit_record&REC)のconst { vec3 OC = r.origin() - 中心; フロート A = ドット(r.direction()、r.direction())。 フロート Bの=はドット(OC、r.direction())。 フロート C =ドット(OC、OC) -半径* 半径。 フロート判別式= B * B - * C; もし(判別式> 0 ){ フロート TEMP =(-b - SQRT(B * B - * C))/ 。 もし(温度<T_MAX && TEMP> T_MIN){ rec.t = TEMP。 rec.p =r.point_at_parameter(rec.t)。 rec.normal =(rec.p -中心)/ 半径。 返す 真; } TEMP =(-b + SQRT(B * B - * C))/ 。 もし(温度<T_MAX && TEMP> T_MIN){ rec.t = TEMP。 rec.p = r.point_at_parameter(rec.t)。 rec.normal =(rec.p -中心)/ 半径。 返す 真; } } を返す 偽。 } #endifの
アンチエイリアシングを着色
光の反射の増加
vec3色(CONST光線&R、hitable * 世界){ hit_record REC。 もし(世界的>ヒット(R、0.001 、FLT_MAX)、REC){ vec3 RND = random_in_unit_shpere()。 vec3対象 = rec.p + rec.normal + RND。 // のprintf( "%F%F%F \ n"は、RND [0]、RND [1]、RND [2])。 戻り 0.5 *色(光線(rec.p、ターゲット- rec.p)、世界)。 } 他{ vec3 unit_direction = unit_vector(r.direction())。 フロート T = 0.5 *(unit_direction.y()+ 1.0); リターン(1.0 - T)* vec3(1.0、1.0、1.0)+ T * vec3(0.5、0.7、1.0 )。 } }