Tôi đang viết một trình theo dõi tia. Cho đến nay tôi có ánh sáng khuếch tán và ánh sáng Blinn. Đã xảy ra lỗi với sự khúc xạ của tôi và tôi không biết gì. Tôi hy vọng ai đó có thể giúp tôi. Theo dõi tia - lỗi khúc xạ
Tôi có vùng khuếch tán màu đỏ lớn + quả cầu Blinn và khúc xạ khúc xạ nhỏ có chỉ số khúc xạ n = 1.5.
Tài khoản nhỏ thực sự bị hỏng.
đang liên quan:
ReflectiveSurface::ReflectiveSurface(const Color& _n, const Color& _k) :
F0(Color(((_n - 1)*(_n - 1) + _k * _k)/((_n + 1)*(_n + 1) + _k * _k))) {}
Color ReflectiveSurface::F(const Point& N, const Point& V) const {
float cosa = fabs(N * V);
return F0 + (F0 * (-1) + 1) * pow(1 - cosa, 5);
}
Color ReflectiveSurface::getColor(const Incidence& incidence, const Scene& scene, int traceDepth) const {
Point reflectedDir = reflect(incidence.normal, incidence.direction);
Ray ray = Ray(incidence.point + reflectedDir * epsilon, reflectedDir);
return F(incidence.normal, incidence.direction) * scene.rayTrace(ray, traceDepth + 1);
}
Point ReflectiveSurface::reflect(const Point& N, const Point& V) const {
return V - N * (2 * (N * V));
}
bool RefractiveSurface::refractionDir(Point& T, Point& N, const Point& V) const {
float cosa = -(N * V), cn = n;
if (cosa < 0) { cosa = -cosa; N = N * (-1); cn = 1/n; }
float disc = 1 - (1 - cosa * cosa)/cn/cn;
if (disc < 0) return false;
T = V/cn + N * (cosa/cn - sqrt(disc));
return true;
}
RefractiveSurface::RefractiveSurface(float _n, const Color& _k) : ReflectiveSurface(Color(1, 1, 1) * _n, _k) {}
Surface* RefractiveSurface::copy() { return new RefractiveSurface(*this); }
Color RefractiveSurface::getColor(const Incidence& incidence, const Scene& scene, int traceDepth) const {
Incidence I = Incidence(incidence);
Color reflectedColor, refractedColor;
Point direction = reflect(I.normal, I.direction);
Ray reflectedRay = Ray(I.point + direction * epsilon, direction);
if (refractionDir(direction, I.normal, I.direction)) {
Ray refractedRay = Ray(I.point + direction * epsilon, direction);
Color colorF = F(I.normal, I.direction);
reflectedColor = colorF * scene.rayTrace(reflectedRay, traceDepth + 1);
refractedColor = (Color(1, 1, 1) - colorF) * scene.rayTrace(refractedRay, traceDepth + 1);
}
else {
reflectedColor = scene.rayTrace(reflectedRay, traceDepth + 1);
}
return reflectedColor + refractedColor;
}
Mã này là ở khắp mọi nơi, vì đây là một bài tập về nhà và tôi không được phép bao gồm tiêu đề bổ sung và tôi phải gửi nó ở trong một tập tin cpp, vì vậy tôi phải tách từng lớp thành tờ khai, khai báo và thực hiện chuyển tiếp trong một tệp đó. Nó làm tôi nôn mửa nhưng tôi cố gắng giữ cho nó sạch sẽ nhất có thể. Có rất nhiều mã vì vậy tôi chỉ bao gồm những gì tôi nghĩ là có liên quan nhất. ReflectiveSurface là lớp cha của RefractiveSurface. N là bề mặt bình thường, V là vectơ hướng tia này bình thường, n là chỉ số khúc xạ. Cấu trúc tỷ lệ nắm giữ một điểm, một vectơ bình thường và hướng.
thức cho xấp xỉ Fersnel và vector khúc xạ tương ứng:
Bạn có thể thấy trong các mã mà tôi sử dụng một epsilon * giá trị hướng ray để tránh bóng mụn do không chính xác phao. Một cái gì đó tương tự dường như đang xảy ra với quả cầu nhỏ, mặc dù. Một ảnh chụp màn hình:
Như bạn thấy, lĩnh vực không xuất hiện trong suốt, nhưng nó thừa hưởng màu sắc lĩnh vực khuếch tán của. Nó cũng thường có một số điểm ảnh màu trắng.
Nếu không có khúc xạ:
Loại số nào có liên quan? Có thể các giá trị của bạn quá nhỏ để được biểu diễn chính xác bằng 'float' và sẽ bằng 0. Bạn có thể/bạn đã thử sử dụng 'double' thay thế? –
Dường như nằm trong khoảng 20-100 cho hai giá trị màu trong vài lần lặp đầu tiên khi nó đến đó ở chế độ gỡ lỗi ở cuối hàm getColor, và sau đó sẽ được chia cho khoảng cách^2 từ máy ảnh và bảo hòa. – PEC
Chúng ta đều nghĩ về nó. NGÔI SAO CHẾT –