Przez ostatnie kilka dni hakowałem raytracera po raz pierwszy. Jest jednak kilka dziwactw, które mnie niepokoją i naprawdę nie wiem, jak się uczyć. To, co było tam od początku, to kształt sfer w scenie - gdy są renderowane, faktycznie wyglądają jak owale. Oczywiście na scenie jest perspektywa, ale ostateczny kształt nadal wydaje się dziwny. Dołączyłem renderowanie próbek, problem, który mam, jest szczególnie widoczny w sferze odbijającej w lewej dolnej części obrazu.Dlaczego raytracer renderuje kule jako owale?
ja naprawdę nie wiem, co może być przyczyną tego. Może to być kod przecięcia sfery promienistej, który wygląda następująco:
bool Sphere::intersect(Ray ray, glm::vec3& hitPoint) {
//Compute A, B and C coefficients
float a = glm::dot(ray.dir, ray.dir);
float b = 2.0 * glm::dot(ray.dir, ray.org-pos);
float c = glm::dot(ray.org-pos, ray.org-pos) - (rad * rad);
// Find discriminant
float disc = b * b - 4 * a * c;
// if discriminant is negative there are no real roots, so return
// false as ray misses sphere
if (disc < 0)
return false;
// compute q
float distSqrt = sqrt(disc);
float q;
if (b < 0)
q = (-b - distSqrt)/2.0;
else
q = (-b + distSqrt)/2.0;
// compute t0 and t1
float t0 = q/a;
float t1 = c/q;
// make sure t0 is smaller than t1
if (t0 > t1) {
// if t0 is bigger than t1 swap them around
float temp = t0;
t0 = t1;
t1 = temp;
}
// if t1 is less than zero, the object is in the ray's negative direction
// and consequently the ray misses the sphere
if (t1 < 0)
return false;
// if t0 is less than zero, the intersection point is at t1
if (t0 < 0) {
hitPoint = ray.org + t1 * ray.dir;
return true;
} else { // else the intersection point is at t0
hitPoint = ray.org + t0 * ray.dir;
return true;
}
}
A może to być coś innego. Czy ktoś ma pomysł? Dzięki wielkie!
Poza tym, mam także wrażenie, że moje załamania są wyłączone (patrz sfera po prawej, współczynnik załamania to 1,8). Czy zgadzacie się z tym? – user1845810
Co się stanie, gdy renderujesz tylko jedną kulkę na środku ekranu? – OopsUser