フィールド関数をレンダリングするためにレイマーチングを使用しているとしましょう。(これは GPU ではなく CPU で行われます。) 私はこの大まかに書かれた疑似コードのようなアルゴリズムを持っています:
pixelColour = arbitrary;
pixelTransmittance = 1.0;
t = 0;
while (t < max_view_distance) {
point = rayStart + t*rayDirection;
emission, opacity = sampleFieldAt(point);
pixelColour, pixelTransmittance =
integrate(pixelColour, pixelTransmittance, emission, absorption);
t = t * stepFactor;
}
return pixelColour;
ロジックはすべて非常に単純です...しかし、どのように機能integrate()
するのでしょうか?
各サンプルは、サンプルがポイントで取得されたとしても、ポイントではなく、実際には私のフィールド内のボリュームを表します。したがって、最終的なピクセル カラーへの影響は、ボリュームのサイズによって異なります。
これを行う方法がわかりません。私は周りを見回しましたが、それを行う多くのコードを見つけましたが (通常は Shadertoy で)、すべての方法が異なり、理由の説明が見つかりません。これはどのように機能するのでしょうか? さらに重要なのは、Google で検索できる魔法の検索用語を教えてください。