Một số phương pháp để hiển thị độ trong suốt trong OpenGL là gì


14

Có thể bật Alpha trộn để làm cho các bề mặt trong suốt, như vậy:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Nhưng điều này chỉ hoạt động nếu các đối tượng được hiển thị trở lại thứ tự trước. Nếu không, những thứ trong nền xuất hiện trước các vật thể gần hơn, như sàn nhà trong hình ảnh bên dưới. Đối với việc sắp xếp các phần tử và các phần tử GUI sẽ ổn, nhưng đối với các lưới tam giác thì có vẻ như đó là quá nhiều nỗ lực và chậm chạp, như đã thảo luận ở đây: https://www.opengl.org/wiki/Trans minh_Sorting .

Các phương pháp phổ biến để đối phó với điều này là gì? Tôi biết điều này khá rộng và không phải sau chi tiết triển khai chuyên sâu, chỉ là một mô tả ngắn gọn về một số phương pháp và những gì có thể liên quan.

nhập mô tả hình ảnh ở đây


Tôi không chắc liệu đây có phải là câu trả lời hay không, nhưng các lỗi trong hình ảnh của bạn là do kết xuất mà không kiểm tra độ sâu trên tất cả các nguyên thủy. Bạn nên kết xuất cảnh trong 2 lần: Đầu tiên kết xuất bình thường tất cả các hình dạng rắn. Sau đó, vô hiệu hóa ghi sâu (không phải GL_DEPTH_TEST) và hiển thị hình học mờ theo thứ tự gần như quay lại phía trước. Điều này sẽ đảm bảo rằng hình học trong suốt sẽ không được vẽ trước hình học rắn ở phía trước nó.
yuriks

@yuriks Trong trường hợp này có lẽ là một ví dụ tồi về phía tôi, nhưng mọi thứ đều có nghĩa là minh bạch. Tôi muốn một cái gì đó cho thấy sự minh bạch sai có thể trông như thế nào khi được thực hiện tồi. Ngoài ra một ví dụ trong đó việc sắp xếp hình học sẽ rất khó khăn (ví dụ ở đây, sàn là một đa giác khổng lồ và bao phủ toàn bộ phạm vi độ sâu).
jozxyqk

Câu trả lời:


10

Một tập hợp các kỹ thuật để tránh thứ tự rõ ràng đi theo tên của Đơn hàng minh bạch độc lập (viết tắt là OIT).

Có rất nhiều kỹ thuật OIT.

Trong lịch sử một là lột sâu . Trong cách tiếp cận này, trước tiên bạn hiển thị các mảnh / pixel phía trước nhất, sau đó bạn tìm thấy phần gần nhất với phần được tìm thấy ở bước trước và cứ thế, tiếp tục với nhiều "lớp" như bạn cần. Nó được gọi là bóc sâu vì mỗi lần vượt qua bạn "bóc" một lớp sâu. Tất cả các lớp của bạn sau đó có thể được kết hợp lại bình thường từ sau ra trước. Để thực hiện thuật toán này, bạn cần có một bản sao của bộ đệm độ sâu.

Một bộ kỹ thuật khác là các OIT trộn. Một trong những điều gần đây và thú vị nhất là OIT có trọng số được đề xuất bởi McGuire và Bavoil . Về cơ bản, nó áp dụng một tổng trọng số cho tất cả các bề mặt chiếm một mảnh nhất định. Lược đồ trọng số mà họ đề xuất dựa trên không gian máy ảnh Z (như là một xấp xỉ với tắc) và độ mờ.
Ý tưởng là nếu bạn có thể giảm vấn đề xuống một khoản tiền có trọng số, bạn không thực sự quan tâm đến việc đặt hàng.

Khác với bài báo gốc, một nguồn tài nguyên tuyệt vời để biết chi tiết triển khai và các vấn đề của OIT có trọng số có trong blog của Matt Pettineo . Như bạn có thể đọc từ bài viết của mình, kỹ thuật này không phải là một viên đạn bạc. Vấn đề chính là sơ đồ trọng số là trung tâm và nó cần được điều chỉnh theo cảnh / nội dung của bạn. Từ các thí nghiệm của ông, trong khi kỹ thuật dường như hoạt động tốt với độ mờ tương đối thấp và trung bình, thì nó lại thất bại khi độ mờ tiếp cận 1 và do đó không thể được sử dụng từ các vật liệu có phần lớn của bề mặt mờ đục (ông làm ví dụ về tán lá).

Một lần nữa, tất cả đều thuộc về cách bạn điều chỉnh độ sâu của mình và tìm ra mức phù hợp hoàn hảo với các trường hợp sử dụng của bạn không nhất thiết là tầm thường.

Đối với những gì cần thiết cho OIT Blended Blended, không có gì nhiều hơn hai mục tiêu kết xuất bổ sung. Một màu mà bạn điền với màu alpha được sắp xếp sẵn (màu * alpha) và alpha, cả hai đều có trọng số tương ứng. Một cái khác chỉ dành cho trọng lượng.


6

Một lựa chọn là sử dụng lột sâu.

Về cơ bản, người ta xử lý cảnh một số lần được đặt (giả sử, nlần) để xác định lần gần nhất, lần thứ hai gần nhất, tất cả các cách đến đoạn nthứ gần nhất của cảnh.

Quá trình xử lý này được thực hiện bằng cách trước tiên áp dụng thử nghiệm độ sâu thông thường cho toàn bộ cảnh (tự nhiên trả về bề mặt gần nhất). Sau đó, người ta sử dụng kết quả của kiểm tra độ sâu để lọc ra lớp đầu tiên, bằng cách bỏ qua mọi thứ có độ sâu nhỏ hơn so với trả về trong kiểm tra độ sâu.

Áp dụng kiểm tra độ sâu một lần nữa sau đó sẽ trả lại lớp thứ hai. Lặp lại khi cần thiết.

Khi bạn có các lớp, bạn có thể vẽ tất cả các lớp theo thứ tự ngược lại (giả sử bạn đã theo dõi các màu RGBA cho mỗi lớp), pha trộn bình thường, vì các lớp theo thứ tự từ trước ra sau.


1
Cảm ơn! Có vẻ như tôi sẽ cần hai bộ đệm sâu cho việc này. Tức là một để lưu trữ và lọc ra các độ sâu cuối cùng, và một để thực hiện kiểm tra độ sâu cho kết xuất hiện tại. Sửa lỗi cho tôi nếu tôi sai nhưng tôi cho rằng tôi sẽ cần hai kết cấu có chiều sâu cho FBO mà tôi trao đổi giữa mỗi lần lột.
jozxyqk

1
@jozxyqk Đúng, hai bộ đệm sâu là cần thiết cho thủ tục này.
es1024

1

Creme de la creme của một lần vượt qua không (hoặc ít) làm ảnh hưởng đến tính minh bạch trong OpenGL là bộ đệm A. Với OpenGL hiện đại, có thể thực hiện:

http://blog.icare3d.org/2010/06/fast-and-accur-single-pass-buffer.html

Nó tránh được nhiều lần lột sâu và không yêu cầu sắp xếp hợp lý.


3
Lý tưởng nhất, câu trả lời nên được khép kín và phụ thuộc rất nhiều vào các liên kết bên ngoài. Có liên kết là tốt cho tài liệu bổ sung, nhưng một câu trả lời không nên chỉ bao gồm một từ khóa. Nếu bạn có thể bao gồm một số chi tiết về bộ đệm A là gì và cách thức hoạt động của nó sẽ cải thiện đáng kể câu trả lời của bạn.
Martin Ender
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.