Хорошо, я работаю над трассировщиком лучей с использованием затенения по фонгу. Пока все хорошо. Я пролил лучи, которые попали на сферы в моей сцене, применил к ним затенение фонга, и это выглядит нормально.
Теперь я вычисляю теневые лучи, которые испускают луч из точки пересечения первичного луча с источником света и смотрю, попадает ли он в какие-либо объекты на своем пути. Если да, то в тени.
Однако при вычислении того, попадает ли теневой луч в какие-либо сферы, кажется, есть ошибка с моим вычисленным дискриминантом, что является странным, поскольку до сих пор он был правильным для первичных лучей.
Вот установка:
// Origin of ray (x,y,z)
origin: -1.9865333, 1.0925934, -9.8653316
// Direction of ray (x,y,z), already normalized
ray: -0.99069530, -0.13507602, -0.016648887
// Center of sphere (x,y,z)
cCenter: 1.0, 1.0, -10.0
// Radius of the sphere (x,y,z)
cRadius: 1.0
, а вот код для поиска дискриминанта:
// A = d DOT d
float a = dotProd(ray, ray);
// B = 2 * (o - c) DOT d
Point temp (2.0*(origin.getX() - cCenter.getX()), 2.0*(origin.getY() - cCenter.getY()), 2.0*(origin.getZ() - cCenter.getZ()));
float b = dotProd(temp, ray);
// C = (o - c) DOT (o - c) - r^2
temp.setAll(origin.getX() - cCenter.getX(), origin.getY() - cCenter.getY(), origin.getZ() - cCenter.getZ());
float c = dotProd(temp, temp);
c -= (cRadius * cRadius);
// Find the discriminant (B^2 - 4AC)
float discrim = (b*b) - 4*a*c;
Ясно, что луч направлен от сферы, но дискриминант здесь положительный (2,88), что указывает на то, что луч попадает в сферу. И этот код отлично работает для первичных лучей, поскольку их дискриминанты должны быть правильными, но не для этих вторичных теневых лучей.
Я что-то упустил?