私の球体に適した照明モデルを得るにはいくつか問題があります。具体的には、球体の鏡面ハイライトを正しいものにすることはできません。これらの拡散球のために(私が理解したよう
球形レイトレーシング - 鏡面ハイライト
今、鏡面ハイライトはもう少しこれらのようになります。ここで私は球を光線追跡するとき、私は見ていますものです)次のようになります
C Rが球体の色である場合、C がambieありますリットル C光の塩基成分が、光の色である、n
は球面上の交点に正常で、 Pが鏡面ハイライトの色がC l
は、光の方向であり、e
目/ Look From、r
は、球の表面からの反射ベクトルであり、指数のp
は、フォン定数/指数(光線がどれくらい強く/ゆるいか)を表します。この場合には、フォン用語のアイ成分は、および方向(1、0、0)であるから、カメラの外観は、であることを
public Color calculateIlluminationModel(Vector normal, Scene scene)
{
//c = cr * ca + cr * cl * max(0, n \dot l)) + cl * cp * max(0, e \dot r)^p
Vector lightSourceColor = getColorVector(scene.getLight().getLightColor()); //cl
Vector diffuseReflectanceColor = getColorVector(getMaterialColor()); //cr
Vector ambientColor = getColorVector(scene.getLight().getAmbientLightColor()); //ca
Vector specularHighlightColor = getColorVector(getSpecularHighlight()); //cp
Vector directionToLight = scene.getLight().getDirectionToLight(); //l
Vector reflectionVector = normal.multiply(2).multiply(normal.crossProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l
Vector ambientTerm = diffuseReflectanceColor.multiply(ambientColor);
double angleBetweenLightAndNormal = directionToLight.dotProduct(normal);
Vector diffuseTerm = diffuseReflectanceColor.multiply(lightSourceColor).multiply(Math.max(0, angleBetweenLightAndNormal));
Vector phongTerm = lightSourceColor.multiply(specularHighlightColor).multiply(Math.pow(Math.max(0, scene.getCameraSettings().getLookFrom().dotProduct(reflectionVector)), (double) getPhongConstant()));
return getVectorColor(ambientTerm.add(diffuseTerm).add(phongTerm));
}
注:ここ
は私のプロセスであります光は(1,0,0)である。私の鏡面ハイライトが光の方向に向かうのではなく、球の上にある理由はありますか?
私があなたを助けてくれるように重要な詳細を出してくれたら教えてください。
はなぜ、あなたのカメラルックから常に(0、0、1)?現在描画しているピクセルに応じて異なるはずですか? –
私の理解は、光線の目/起点は、光線の方向だけでは変わらないということでした。 –