Làm thế nào tôi có thể nói với một shader mảnh để không viết một pixel cụ thể?


11

Trong một WebGL, tôi muốn gửi một quad không gian màn hình thông qua đó được xử lý bởi một shader mảnh, nhưng có shader mảnh chỉ viết ra một pixel trong một số điều kiện nhất định (giả sử ... nó nằm trong một vòng tròn hoặc rằng pixel thuộc về mặt tích cực của nửa không gian được xác định bởi phương trình đường cong hoặc một cái gì đó).

Có thể trong một shader mảnh có thể nói "không viết pixel" không?

Tôi biết điều này có thể được thực hiện bằng nhiều phương pháp khác như trộn alpha, hiển thị cái này trước và đặt màu nền ở nơi nó không muốn vẽ pixel hoặc có thể thực hiện một số mẹo với bộ đệm độ sâu hoặc stprint. Tôi cũng biết tôi có thể tạo ra một loạt các hình học để phù hợp với những gì tôi muốn kết xuất.

Có cách nào để làm cho shader mảnh chọn không viết một pixel nào không?

Câu trả lời:


10

Có, bạn có thể discardtrong shader mảnh để tránh ghi pixel.Đây là một ví dụ ngẫu nhiên tôi đào từ Google.

Lưu ý rằng điều này có thể không thực sự ngăn chặn trình phân mảnh mảnh xử lý (vì GPU có xu hướng xử lý các đoạn trong các khối; chỉ loại bỏ khỏi tất cả các đoạn trong một khối sẽ từ bỏ quá trình xử lý). Nhưng đoạn này sẽ không được ghi vào đầu ra, về cơ bản là những gì bạn muốn.

Bạn có thể quan tâm đến câu hỏidiscard liên quan này về hiệu suất củacâu hỏi này trên SO.

Tôi không biết nếu điều này được hỗ trợ trong WebGL. Nếu không, bạn sẽ cần quay lại một trong những đề xuất của mình (như pha trộn alpha; tôi nghĩ đó sẽ là cách đơn giản nhất).


3

Các discardtuyên bố có ích.

Bạn đã không nói quá nhiều về đường dẫn quyết định của mình, vì vậy tôi sẽ đưa ra một ví dụ bằng cách sử dụng tra cứu kết cấu đơn giản:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(Đó là từ một số mã mẫu tôi đã viết trước khi tôi tìm hiểu về pha trộn alpha.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.