Czytałem wiele artykułów na temat śledzenia promieni i cieniowania, ale mój prześwietlany obraz nie wygląda zbyt dobrze. Mówię o bardzo jasnym zielonym obszarze w pobliżu najciekawszych punktów. Tutaj wygląda na to, że zielony kolor jest tu maksymalny. Jak dostosować kolory i/lub obliczenia cieniowania, aby wyglądał prawidłowo?Raytracing - jak połączyć barwę dyfuzyjną i lustrzaną?
(Nieważne, głupi kod, po prostu staram się najpierw poprawić zasady).
Oto jak to wygląda:
Oto tylko rozproszony komponent:
Oto komponent lustrzane tylko:
EDYCJA: Zmiana dyfuzji na Kolor rozproszony Kolor = Kolor (0,0f, 0,6f, 0,0f); Wtedy obraz wygląda tak:
Point lightPosition = PointMake(-100.0f, 100.0f, -100.0f);
Color diffuseColor = ColorMake(0.0f, 1.0f, 0.0f);
Color specularColor = ColorMake(1.0f, 1.0f, 1.0f);
Color pixelColor = ColorMake(0.0f, 0.0f, 0.0f);
// Trace...
// Diffuse
Point intersectionPosition = PointMake(x, y, z);
Vector intersectionNormal = VectorMake((x - xs)/rs, (y - ys)/rs, (z - zs)/rs);
Vector intersectionNormalN = VectorNormalize(intersectionNormal);
Vector lightVector = VectorSubtract(lightPosition, intersectionPosition);
VectorlightVectorN = VectorNormalize(lightVector);
float cosTheta = VectorDotProduct(intersectionNormalN, lightVectorN);
if (cosTheta < 0.0f)
{
cosTheta = 0.0f;
}
pixelColor = ColorMultScalar(diffuseColor, cosTheta);
// Specular
Vector incomVector = VectorSubtract(intersectionPosition, lightPosition);
Vector incomVectorN = VectorNormalize(incomVector);
float myDot = - VectorDotProduct(incomVectorN, intersectionNormalN);
float myLen = 2.0f * myDot;
Vector tempNormal = VectorMultScalar(intersectionNormalN, myLen);
Vector reflectVector = VectorAdd(tempNormal, incomVectorN);
Vector reflectVectorN = VectorNormalize(reflectVector);
float mySpec = MAX(-VectorDotProduct(reflectVectorN, incomVectorN), 0);
mySpec = powf(mySpec, 5);
specularColor = ColorMultScalar(specularColor, mySpec);
pixelColor = ColorAdd(pixelColor, specularColor);
pixelColor = ColorClamp(pixelColor);
[self putPixelatX:i andY:j andR:pixelColor.r andG:pixelColor.g andB:pixelColor.b];
To nieprawda, o to chodzi. Nie może istnieć "gwarancja poprawności";) - tak naprawdę jest to tylko sposób na kolorowanie pikseli za pomocą przydatnych funkcji matematycznych (np. Pow phong i pewna arbitralna wartość dla ambientu). Przynajmniej tak to widzę. Najważniejsze; PBRT FTW !! 1 –
Podczas gdy twój punkt jest w 100% ważny, wielu ludzi, którzy wskakują do raytracingu, nie zdaje sobie sprawy z tego faktu - są oni zwykle zachwyceni ładnymi obrazami, nie wiedząc, że istnieje cała garść potrzebnych ulepszeń :) –