「DirectX 11 Rendering in Battlefield 3」PowerPointのスライドの1つで、次のコードに気付きました。
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
単に半径を保存するのではなく、なぜ半径の2乗、さらには逆2乗(単に1の2乗の半径)を保存するのか理解できません。彼らは計算でこのデータをどのように使用していますか?さらに、コーンライトとラインライトはどうですか?この構造体はポイントライト専用である必要があります。他のタイプでは機能しないことがわかります-データが十分ではありません。それでも、私は彼らがその正方形とinvSquareをどのように使用しているかを知りたいです。
更新: OK
これは、ネット上で簡単に見つけられる古典的な光減衰方程式です。
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
これをlength(lightVector)
実際に行っているので、比較的コストがかかります。
length(lightVector) = sqrt(dot(lightVector, lightVector);
さらに、分割操作(/lightRadius)
も非常にコストがかかります。
この方法で光の減衰を計算する代わりに、次の方法で計算できます。これははるかに高速です。
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
invRadiusSqrはCPUレベルで事前に計算され、シェーダー定数として渡されます。
さらに、結果として(前者の場合は線形ではなく)2次光減衰が得られます。これは、IRL光が2次減衰を示すため、さらに優れています。
皆さん、助けてくれてありがとう!