私は宇宙からの惑星の大気散乱を実装する過程にいます。http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.htmlからSean O'Neilのシェーダーを出発点として使用しています。
ここにあるGroundFromSpaceシェーダーではなく、SkyFromSpaceシェーダーを除いて、fCameraAngleに関連する問題はほとんどあります。http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
fCameraAngle = 1
内側のループで使用していない場合、スペースシェーダーから空の奇妙なアーティファクトを取得します。これらのアーティファクトの原因は何ですか?fCameraAngleが1に制限されると、アーティファクトは消えます。O'Neilのサンドボックス(http://sponeil.net/downloads.htm)にある色相も欠けているようです。
カメラ位置X = 0、Y = 0、Z = 500。左側のGroundFromSpace、右側のSkyFromSpace。
カメラ位置X = 500、Y = 500、Z = 500。左側のGroundFromSpace、右側のSkyFromSpace。
カメラの角度は、ソースに応じて非常に異なる方法で処理されるようであることがわかりました。
元のシェーダーでは、SkyFromSpaceShaderのカメラアングルは次のように計算されます。
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
一方、スペースシェーダーの地面では、カメラの角度は次のように計算されます。
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
しかし、さまざまなソースがオンラインで、レイを否定しています。どうしてこれなの?
問題を示し、画像の生成に使用したC#Windows.Formsプロジェクトは次のとおりです。https : //github.com/ollipekka/AtmosphericScatteringTest/
更新: O'NeilのサイトにあるScatterCPUプロジェクトから、カメラがシェーディングされているポイントの上にあるときにカメラレイが無効になり、ポイントからカメラへの散乱が計算されることがわかりました。
光線の方向を変更すると、実際にアーティファクトは削除されますが、次に示すように他の問題が発生します。
さらに、ScatterCPUプロジェクトでは、O'Neilは光の光学的深さが0未満の状況から保護します。
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
コメントで指摘されているように、これらの新しいアーティファクトとともに、これは依然として疑問を残しています。カメラが500、500、500に配置されている画像の何が問題になっていますか?ハローが惑星の完全に間違った部分に焦点を合わせているように感じます。昼から夜へと変化する場所ではなく、太陽が惑星に当たるはずの場所に光が近づくと予想されます。
githubプロジェクトは、この更新の変更を反映するように更新されました。