Vì vậy, tôi đã có một kẻ mạo danh (hình học thực sự là một khối lập phương, có thể cắt bớt, và hình dạng imposter là một miếng bọt biển Menger) và tôi cần phải tính toán chiều sâu của nó.GLSL gl_FragCoord.z Tính toán và thiết lập gl_FragDepth
Tôi có thể tính toán số tiền để bù đắp trong không gian thế giới khá dễ dàng. Thật không may, tôi đã dành nhiều giờ không làm xáo trộn chiều sâu với nó.
duy nhất kết quả chính xác tôi có thể nhận được khi tôi đi:
gl_FragDepth = gl_FragCoord.z
Về cơ bản, tôi cần phải biết làm thế nào gl_FragCoord.z được tính toán sao mà tôi có thể:
- Hãy việc chuyển đổi ngược từ gl_FragCoord.z đến không gian mắt
- Thêm độ nhiễu ở độ sâu
- Biến đổi độ sâu bị xáo trộn này trở lại cùng không gian với gl_FragCoord.z ban đầu.
Tôi xin lỗi nếu điều này có vẻ như một câu hỏi trùng lặp; có một số bài đăng khác ở đây đề cập đến những điều tương tự. Tuy nhiên, sau khi thực hiện tất cả chúng, không có gì hoạt động chính xác. Thay vì cố gắng chọn một để được giúp đỡ, tại thời điểm này, tôi yêu cầu mã hoàn chỉnh thực hiện điều đó. Nó chỉ là một vài dòng.
Bạn đã viết một trình đổ bóng đỉnh chưa? hoặc chỉ là một shader fragment? –
Tôi sẽ không cung cấp cho bạn mã theo nguyên tắc chung, nhưng tôi có thể cung cấp cho bạn [liên kết này tới Wiki OpenGL] (http://www.opengl.org/wiki/Compute_eye_space_from_window_space). Cũng như liên kết này đến hướng dẫn của tôi về [kẻ mạo danh và chiều sâu cũng cho thấy cách thực hiện điều này] (http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html). Chuyển đổi chiều sâu trở lại là tầm thường. –
Michael: vâng, nhưng nó chỉ là thông qua shader.Khi nó xảy ra, các tính toán được thực hiện trong không gian thế giới, vì vậy tôi có thể tính toán không gian mắt trong chương trình phân đoạn. Nicol, tôi đã xem trang đó. Tôi triển khai nó như sau: vec4 clip_pos = gl_ProjectionMatrix * vec4 (eye_pos, 1.0); float ndc_depth = clip_pos.z/clip_pos.w; gl_FragDepth = (((clip_far-clip_near) * ndc_depth) + clip_near + clip_far)/2.0; Thật không may, độ sâu dường như nằm ngoài phạm vi độ sâu, mặc dù không có bù đắp. Cảm ơn, – imallett