2014-06-07 21 views
6

Trong WebGL, có thể ghi vào giá trị độ sâu của đoạn hay kiểm soát giá trị độ sâu của đoạn theo cách khác không?Webgl: thay thế bằng văn bản thành gl_FragDepth

Theo như tôi có thể tìm thấy, gl_FragDepth không có trong webgl 1.x, nhưng tôi tự hỏi nếu có cách nào khác (tiện ích mở rộng, hỗ trợ cụ thể cho trình duyệt, v.v.) để thực hiện.

Điều tôi muốn lưu trữ là để phát tia đối tượng theo dõi cùng với các yếu tố khác được vẽ bằng mô hình, chế độ xem, hình chiếu thông thường.

+0

Bạn có thể thao tác giá trị độ sâu trong đổ bóng đỉnh như thế này 'gl_Position.z = x * 2.0 - 1.0' trong đó' x' trong '[0,1]' (hoặc '[-1,1]' không có '* 2.0 - 1.0') ... Nhưng điều này sẽ hoạt động nếu 'gl_Position.w = 1.0' ... –

+0

@andre Không có giải pháp cho điều này chưa? –

+1

@ViktorSehr trông giống như một số trình duyệt hiện triển khai tiện ích. Xem câu trả lời được chấp nhận. – andre

Trả lời

4

Có phần mở rộng EXT_frag_depth

Bởi vì đó là một phần mở rộng nó có thể không có sẵn ở khắp mọi nơi, do đó bạn cần phải kiểm tra xem nó tồn tại.

var isFragDepthAvailable = gl.getExtension("EXT_frag_depth"); 

Nếu isFragDepthAvailable không falsey sau đó bạn có thể kích hoạt nó trong shaders của bạn với

#extension GL_EXT_frag_depth : enable 

Nếu không, bạn có thể thao tác gl_Position.z trong vertex shader của bạn mặc dù tôi nghi ngờ đó không phải là thực sự là một giải pháp khả thi đối với hầu hết nhu cầu.

2

Brad Larson có một cách giải quyết thông minh cho điều này mà ông sử dụng trong phân tử (full blog post):

Để làm việc xung quanh này, tôi thực hiện riêng depth buffer tùy chỉnh của tôi sử dụng một đối tượng đệm khung đã được ràng buộc với một kết cấu kích thước của màn hình . Đối với mỗi khung hình, trước tiên tôi thực hiện một đường chuyền hiển thị khi giá trị chỉ là đầu ra là giá trị màu tương ứng với độ sâu tại điểm đó. Để xử lý nhiều đối tượng trùng lặp có thể ghi vào cùng một đoạn, tôi cho phép phối màu và sử dụng phương trình hòa trộn GL_MIN_EXT. Điều này có nghĩa rằng các thành phần màu được sử dụng cho đoạn đó (R, G và B) là tối thiểu của tất cả các thành phần mà đối tượng đã cố gắng ghi vào đoạn đó (trong hệ thống tọa độ của tôi, độ sâu 0.0 gần người xem và 1.0 cách xa ). Để tăng độ chính xác của các giá trị độ sâu được ghi lên kết cấu này, tôi mã hóa độ sâu thành màu theo cách mà độ sâu tăng lên, màu đỏ lấp đầy trước, sau đó là xanh lục và cuối cùng là màu xanh lam. Điều này mang lại cho tôi 768 mức độ sâu, hoạt động khá tốt.

CHỈNH SỬA: Chỉ cần thực hiện WebGL không hỗ trợ pha trộn tối thiểu, vì vậy không hữu ích lắm. Lấy làm tiếc.

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