画像を作成するには、「ファイナルギャザー」を行う必要があります。光線ツリーが光源から分岐している場合、これは光線ツリーの葉を効果的に「装飾」し、目に追加の光線を追加します。
もちろん、そのような光線のすべてが有効であるとは限りません。表面が目とは反対を向いている場合、またはそれが遮られている場合は、拒否する必要があります。光線を生成するこの方法は、通常のレイトレーシングで照明を決定するために必要な「シャドウ」光線に似ていることに注意してください。
追加の問題は、受信した光線が、従来のレイトレーシングが提供する通常のパターンまたは十分に分散されたパターンではなく、ランダムなパターンになることです。これは、ピクセル値を取得するために、カメラが受信した光線を平均化および/または補間する必要があることを意味します。
ピクセルの色は、サンプルの濃度とサンプルの色の値の組み合わせによって決まると思います。もしそうなら、あなたはあなたの平均化/補間法がその振る舞いを提供することを確認したいと思うでしょう。これの最初の近似は、入ってくるサンプルを最も近いピクセルに単純に追加するかもしれません。より良い方法は、入ってくるサンプルごとに単純な添加剤デカールを「はねかける」ことです。より洗練された方法では、デカールのサイズをサンプルの局所密度に比例してスケーリングできますが、統合された明るさの合計はサンプルの明るさに比例します。
編集:入ってくる「目」の光線が与えられた場合でも、入ってくる光線がどの画面位置に対応するかを決定する必要があります。これを行うには、ラスタライズに使用するカメラの「ViewProjection」マトリックスを計算する必要があります。これは実際には、従来のレイトレーシングに使用されるプロセスの逆です。
conventional ray tracing:
// find direction vector for given screen coordinates (x,y)
homog4vector homog_clip_coords( (x - x_offset) / x_resolution,
(y - y_offset) / y_resolution,
1.0, // z-coordinate
1.0); // w-coordinate
homog4vector homog_world_coords = InverseViewProjectionMatrix * homog_clip_coords
ray_vector_x = homog_world_coords.x / homog_world_coords.w - eye_x;
ray_vector_y = homog_world_coords.y / homog_world_coords.w - eye_y;
ray_vector_z = homog_world_coords.z / homog_world_coords.w - eye_z;
rasterization or "reverse" ray tracing:
// find screen coordinates for given source point "p"
homog4vector eye_ray_source(p.x, p.y, p.z, 1.0);
homog4vector homog_clip_coords = ViewProjectionMatrix * homog4vector(x,y,z,1);
screen_coords.x = x_offset + x_resolution * homog_clip_coords.x / homog_clip_coords.w
screen_coords.y = y_offset + y_resolution * homog_clip_coords.y / homog_c.ip_coords.w
もちろん、すべての着信光線が画面に表示されるわけではありません。後ろからカメラに入る光線を必ず破棄してください:
if (homog_clip_coords.z < 0 || homog_clip_coords.w < 0)
{ /* reject ray */ }