2016-03-01 2 views
1

Я только реализованные отражения в моей трассировке лучей, вот код, который обрабатывает отражения, однако у меня есть все мой код загружен на github repository для лучшего чтения:рэйтрэйсер отражения зернистого

Color finalColor = closestObjectMaterial.GetColor() * AMBIENTLIGHT; // Add ambient light to the calculation 

// Reflections 
if(closestObjectMaterial.GetSpecular() > 0 && closestObjectMaterial.GetSpecular() <= 1) 
{ 
    Vector scalar = closestObjectNormal * (closestObjectNormal.Dot(intersectingRayDir.Negative())); 
    Vector resultantReflection = intersectingRayDir.Negative() + ((scalar + (intersectingRayDir)) * 2); 
    Vector reflectionDirection = resultantReflection.Normalize(); 

    Ray reflectionRay(intersectionRayPos, resultantReflection); 

    // determine what the ray intersects with first 
    std::vector<FPType> reflectionIntersections; 
    for(auto sceneObject : sceneObjects) 
    { 
     reflectionIntersections.push_back(sceneObject->GetIntersection(reflectionRay)); 
    } 

    int closestObjectWithReflection = ClosestObjectIndex(reflectionIntersections); 

    if(closestObjectWithReflection != -1) 
    { 
     // reflection ray missed everthing else 
     if(reflectionIntersections[closestObjectWithReflection] > TOLERANCE) 
     { 
      // determine the position and direction at the point of intersection with the reflection ray 
      // the ray only affects the color if it reflected off something 
      Vector reflectionIntersectionPosition = intersectionRayPos + (resultantReflection * (reflectionIntersections[closestObjectWithReflection])); 
      Vector reflectionIntersectionRayDirection = resultantReflection; 
      Color reflectionIntersectionColor = GetColorAt(reflectionIntersectionPosition, reflectionIntersectionRayDirection, sceneObjects, closestObjectWithReflection, lightSources); 
      finalColor += (reflectionIntersectionColor * closestObjectMaterial.GetReflection()); 
     } 
    } 
} 

я получаю эти зернистые артефакты на всех отражений (это разрешение 16k рендер увеличено):

enter image description here

Однако это еще более очевидно на более низких разрешениях, как 1920х1080:

enter image description here

enter image description here

ответ

1

Я думаю, что проблема в том, что отражение лучей попадает на себя. Я не перекомпилировал код, чтобы подтвердить это. Вы можете попробовать добавить смещение к исходной позиции луча отражения.

Vector offset = resultantReflection * 0.001; 
Ray reflectionRay(intersectionRayPos + offset, resultantReflection); 
+0

Я закончил использовать это, результирующее преобразование также должно быть нормализовано. 'Векторное смещение = отражение Направление * 0,001; Ray reflectionRay (intersectionRayPos + смещение, resultantReflection); ' –

+1

В комментариях вы добавили // Смещение добавляется отменяет эффект grainyness в отражениях Действительная проблема, ваши лучи, которые начинаются от отражающего объекта A считается ударом себя, поскольку он является ближайшим объектом от начальной позиции луча. Поэтому, чтобы этого избежать, мы начинаем луч чуть от поверхности объекта А. – codetiger

 Смежные вопросы

  • Нет связанных вопросов^_^