0

過去に2つの従来のレイトレーサーを作成しましたが、今度は、光源からアイポイントまでのフォトンをトレースするリバースレイトレーサーをプログラムしたいと思います。このトピックに関する記事を読んでここ数日を過ごした後、私はそれを試してはいけないことを知っていますが、とにかくやりたいと思っています。私が今直面している問題は、私が作成しようとしている画像の各ピクセルの値をどのように計算するかです。

通常のレイトレーシングでは、アイポイントからイメージプレーンのピクセルを介してシーンにレイを発射し、レイツリーのこのブランチがトレースされた後、そのピクセルに割り当てられたカラー値になります。このプロセスを逆にする方法は考えられません。すべての光線が画像平面とのみ交差するかどうかをテストすると、180度の視野と、画像平面上に焦点があります(ぼやけた混乱)。したがって、すべての光線が画像平面とアイポイントと交差するかどうかをテストする必要があります。ただし、アイポイントはごくわずかな小さなポイントであるため、レイがアイポイントに当たる可能性は(ほぼ)ゼロである必要があります。これにより、画像がまったく表示されなくなります。

だから私の質問は:光源からの光子をトレースすることによってレンダリングされる画像のピクセル値をどのように計算するのですか?

よろしくお願いします、
1月

4

1 に答える 1

1

画像を作成するには、「ファイナルギャザー」を行う必要があります。光線ツリーが光源から分岐している場合、これは光線ツリーのを効果的に「装飾」し、目に追加の光線を追加します。

もちろん、そのような光線のすべてが有効であるとは限りません。表面が目とは反対を向いている場合、またはそれが遮られている場合は、拒否する必要があります。光線を生成するこの方法は、通常のレイトレーシングで照明を決定するために必要な「シャドウ」光線に似ていることに注意してください。

追加の問題は、受信した光線が、従来のレイトレーシングが提供する通常のパターンまたは十分に分散されたパターンではなく、ランダムなパターンになることです。これは、ピクセル値を取得するために、カメラが受信した光線を平均化および/または補間する必要があることを意味します。

ピクセルの色は、サンプルの濃度サンプルの色の値の組み合わせによって決まると思います。もしそうなら、あなたはあなたの平均化/補間法がその振る舞いを提供することを確認したいと思うでしょう。これの最初の近似は、入ってくるサンプルを最も近いピクセルに単純に追加するかもしれません。より良い方法は、入ってくるサンプルごとに単純な添加剤デカールを「はねかける」ことです。より洗練された方法では、デカールのサイズをサンプルの局所密度に比例してスケーリングできますが、統合された明るさの合計はサンプルの明るさに比例します。


編集:入ってくる「目」の光線が与えられた場合でも、入ってくる光線がどの画面位置に対応するかを決定する必要があります。これを行うには、ラスタライズに使用するカメラの「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 */ }
于 2012-10-15T18:39:10.287 に答える