Đặt hàng minh bạch độc lập trong hệ thống hạt


9

Tôi đang viết một hệ thống hạt và muốn tìm một mẹo để đạt được sự pha trộn alpha thích hợp mà không cần sắp xếp các hạt vì:

  • Mỗi hạt là một sprite điểm trong một lưới duy nhất và tôi không thể sử dụng khả năng biểu đồ cảnh để sắp xếp các nút trong suốt. Các nút hệ thống nên được sắp xếp đúng, mặc dù.
  • Vị trí hạt được tính toán trên shader từ vận tốc ban đầu, gia tốc và thời gian. Để sắp xếp hệ thống, tôi sẽ phải thực hiện tất cả các tính toán này trên CPU, đây là điều tôi muốn tránh.
  • Sắp xếp hàng trăm hạt theo vị trí máy ảnh và tải nó lên GPU mỗi đường nối khung để hoạt động nặng nề yên tĩnh.

Thử nghiệm Alpha dường như đủ nhanh trên GLES 2.0 và hoạt động tốt đối với các kết cấu không trong suốt nhưng "bị che". Tuy nhiên, nó không đủ cho các hạt bán trong suốt.

Làm thế nào bạn kiểm soát nó?


Hoàn toàn cần thiết như thế nào mà chúng được sắp xếp đúng? Bạn đã thực sự nhìn thấy bất kỳ đồ tạo tác (quan trọng) bằng cách sử dụng pha trộn vani?
ChrisE

Một hạt có thể hòa trộn với nền thay vì một hạt khác và sau đó bản chất "hình chữ nhật" của sprite điểm là rất đáng chú ý. Thử nghiệm Alpha giúp ở đây nhưng các tạo tác vẫn đáng chú ý khi giá trị alpha yên tĩnh thấp nhưng không đủ để loại bỏ đoạn.
Stepan Zastupov

6
Bạn đã thử vô hiệu hóa ghi sâu (để lại các bài kiểm tra độ sâu) khi kết xuất các hạt chưa? Điều đó sẽ làm cho thứ tự không chính xác ít rõ ràng hơn.
Adam

2
Sau một số thí nghiệm tôi thấy rằng vô hiệu hóa ghi sâu là giải pháp tốt nhất trong hầu hết các trường hợp.
Stepan Zastupov

Câu trả lời:


10

Đây là những gì tôi sẽ làm.

Bước 1: Đừng sắp xếp. Cứ làm đi. Xem nếu nó là một vấn đề. Nhiều khả năng là không.

Bước 2: Hạn chế các hạt thành những thứ không thực sự cần sắp xếp, chẳng hạn như:

  • Chỉ là chất rắn (với các cạnh có thể bao phủ alpha)

    • hãy để zbuffer chăm sóc việc phân loại.
  • Chỉ là các bit phụ gia

    • a + b = b + a, vì vậy thứ tự không quan trọng

Bước 3: nếu cần nhiều hơn, hãy phân tách kết xuất hạt thành các bit phải ở phía trước và phần còn lại và thực hiện kết xuất trong nhiều lần (ví dụ: có thể khắc phục khói phức tạp)

Bước 4: nếu vẫn còn cần thiết hoặc nếu bạn cần một giải pháp chung, một điều bạn cần lưu ý là sử dụng tàu điện ngầm để thực hiện phân loại xô N rất thô; kết xuất các hạt thành N bề mặt đầu ra và kết hợp chúng trong một đường chuyền riêng.

Bất cứ điều gì hơn nữa sẽ yêu cầu thêm thông tin về trường hợp sử dụng cụ thể của bạn. Nhưng tôi khá chắc chắn rằng bạn thực sự không cần sự độc lập trật tự. Chỉ cần sử dụng đủ các hạt đủ ngẫu nhiên và nó sẽ ổn =)


6

Chỉ không ghi vào bộ đệm sâu khi kết xuất các hạt. Điều này sẽ cho phép tất cả chúng được kết xuất và pha trộn với nhau. Bạn vẫn nên thực hiện kiểm tra độ sâu mặc dù vậy chúng có thể được chặn đúng bằng hình học trong cảnh.


5

Sử dụng thứ tự trộn phụ gia không thành vấn đề:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Điều này giả định rằng kết cấu sprite của bạn có một nền trong suốt.

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.