2014-11-04 16 views
6

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. enter image description hereTheo 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: enter image description here

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: enter image description here

enter image description here

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ạ:

enter image description here

+0

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ế? –

+0

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

+0

Chúng ta đều nghĩ về nó. NGÔI SAO CHẾT –

Trả lời

1

Câu trả lời hóa ra khá đơn giản, nhưng tôi phải mất 3 ngày nhìn chằm chằm vào mã để bắt lỗi. Tôi có một lớp Surface, tôi lấy được từ nó hai lớp: RoughSurface (diffuse + blinn) và RelfectiveSurface. Sau đó, RefractiveSurace có nguồn gốc từ RefleciveSurface. Phương thức khởi tạo của ReflectiveSurface lấy chỉ số khúc xạ (n) và giá trị tuyệt đối (k) làm tham số, nhưng không lưu trữ chúng.(F0) được tính toán từ chúng trong quá trình xây dựng, và sau đó chúng bị mất. Khúc xạ Mặt khác, mặt khác, sử dụng (n) trong phép tính góc khúc xạ.

Cũ constructor:

RefractiveSurface::RefractiveSurface(float _n, const Color& _k) : 
    ReflectiveSurface(Color(1, 1, 1) * _n, _k) {} 

New vị thi công:

RefractiveSurface::RefractiveSurface(float _n, const Color& _k) : 
    ReflectiveSurface(Color(1, 1, 1) * _n, _k), n(_n) {} 

Như bạn thấy, tôi quên để lưu (n) giá trị cho RefractiveSurface trong constructor.

nhỏ hình cầu màu đỏ đằng sau quả cầu thuỷ tinh lớn thắp sáng từ hai bên của máy ảnh:

enter image description here

Nó trông tuyệt vời trong chuyển động D

Cảm ơn bạn đã dành thời gian, guys!. Gotta hoàn thành bài tập về nhà này, sau đó tôi sẽ viết lại toàn bộ điều và tối ưu hóa địa ngục ra khỏi nó.

1

RefractiveSurface::refractionDir mất bình thường N bởi (không const) tham khảo, và nó có thể đảo ngược nó. Điều này có vẻ nguy hiểm. Nó không rõ ràng người gọi muốn I. bình thường để được lộn, vì nó được sử dụng trong tính toán màu sắc tiếp tục xuống.

Ngoài ra, refracted_color không phải lúc nào cũng được khởi tạo (trừ khi hàm tạo Màu làm cho màu đen).

Hãy thử (tạm thời) đơn giản hóa và chỉ xem các tia khúc xạ có chạm vào nơi bạn mong đợi không. Loại bỏ tính toán Fresnel và thành phần phản xạ và chỉ cần đặt refracted_color cho kết quả của dấu vết của tia khúc xạ. Điều đó sẽ giúp xác định xem lỗi có trong tính toán Fresnel hay trong hình dạng uốn tia.

Mẹo gỡ lỗi: Tô màu các điểm ảnh không đánh bất kỳ thứ gì khác với màu đen. Điều đó làm cho nó dễ dàng để phân biệt các lỗi từ bóng tối (bề mặt mụn).

Các vấn đề liên quan