EDIT: Я решил проблему; вы можете увидеть мое решение в ответах.Что вызывает артефакты в моем raytracer?
Я в процессе написания raytracer в реальном времени с использованием OpenGL (в GLSL Compute Shader), и у меня возникла небольшая проблема с некоторыми из моих пересечений линий треугольника (или, по крайней мере, я считаю, что они являются виновником). Вот картина того, что происходит:
Как вы можете видеть, что некоторые пиксели будут окрашены в черный цвет, на пересечении двух треугольников в верхней части изображения. Вероятно, это связано с тем, как я обрабатываю поплавки или что-то в этом роде, и я попытался найти решение в Интернете, но не могу найти похожие ситуации. Возможно, есть ключевое ключевое слово, которое я пропускаю?
В любом случае, важная часть кода это одна:
#define EPSILON 0.001f
#define FAR_CLIP 10000.0f
float FindRayTriangleIntersection(Ray r, Triangle p)
{
// Based on Moller-Trumbone paper
vec3 E1 = p.v1 - p.v0;
vec3 E2 = p.v2 - p.v0;
vec3 T = r.origin - p.v0;
vec3 D = r.dir;
vec3 P = cross(D, E2);
vec3 Q = cross(T, E1);
float f = 1.0f/dot(P, E1);
float t = f * dot(Q, E2);
float u = f * dot(P, T);
float v = f * dot(Q, D);
if (u > -EPSILON && v > -EPSILON && u+v < 1.0f+EPSILON) return t;
else return FAR_CLIP;
}
Я пробовал различные значения для EPSILON
, попытался вариации с +/- для EPSILON
значений, но безрезультатно. Кроме того, изменение 1.0f+EPSILON
на 1.0-EPSILON
дает устойчивую черную линию на всем пути.
Также, чтобы уточнить, определенно нет промежутка между двумя треугольниками. Они плотно упакованы (и я также попытался расширить их, чтобы они пересекались, но я все равно получаю одни и те же черные точки).
Любопытно, что на нижнем перекрестке нет признаков этого явления.
Последнее примечание: если требуется больше моего кода, просто спросите, и я попытаюсь выделить еще один код (или, возможно, просто ссылку на весь шейдер).
ОБНОВЛЕНИЕ: Было указано, что «черные артефакты» на самом деле коричневые. Так что я выкопал немного глубже и выключил все отражения, и получил этот результат:
Коричневый цвет сольются из всего медного материала на верхней части, но что более важно, я думаю, что у меня есть идея, в чем причина проблемы, но я не ближе к ее решению.
Похоже, что когда лучи испускаются из-за очень слабых несовершенств в плавающей арифметике, некоторые лучи пересекают верхний треугольник, а некоторые пересекают нижнюю часть.
Итак, я думаю, теперь вопрос сводится к следующему: как я могу иметь какую-то последовательность в определении того, какой треугольник следует ударять в таких случаях?
Пикселы не черные, они темно-коричневые. Проблема заключается в маловероятности вашего кода пересечения лучей треугольника. – Soonts
Спасибо, это было очень полезно для решения, я не понял. Я обновил свой пост с дополнительной информацией. –
Попробуйте изменить EPSILON на 0.0f - что произойдет? – Soonts