Làm thế nào để thực hiện đúng pha trộn alpha trong một cảnh 3D phức tạp?


11

Tôi biết câu hỏi này nghe có vẻ hơi dễ trả lời nhưng nó làm tôi phát điên. Có quá nhiều tình huống có thể xảy ra mà một cơ chế trộn alpha tốt sẽ xử lý và đối với mỗi Thuật toán tôi có thể nghĩ rằng còn thiếu một cái gì đó.

Đây là những phương pháp tôi đã nghĩ cho đến nay:

  • Trước hết tôi về việc sắp xếp đối tượng theo độ sâu, điều này đơn giản là thất bại vì Đối tượng không phải là hình dạng đơn giản, chúng có thể có các đường cong và có thể lặp lại bên trong nhau. Vì vậy, tôi không thể luôn luôn biết cái nào gần camera hơn.

  • Sau đó, tôi nghĩ về việc sắp xếp các hình tam giác nhưng điều này cũng có thể thất bại, tôi nghĩ rằng tôi không chắc cách thực hiện nó có một trường hợp hiếm hoi có thể lại gây ra vấn đề, trong đó hai tam giác đi qua nhau. Một lần nữa không ai có thể nói cái nào gần hơn.

  • Điều tiếp theo là sử dụng bộ đệm độ sâu, ít nhất lý do chính khiến chúng ta có bộ đệm độ sâu là do các vấn đề với việc sắp xếp mà tôi đã đề cập nhưng bây giờ chúng ta gặp một vấn đề khác. Vì các đối tượng có thể trong suốt, trong một pixel có thể có nhiều hơn một đối tượng có thể nhìn thấy. Vậy đối tượng nào tôi nên lưu trữ độ sâu pixel?

  • Sau đó tôi nghĩ có lẽ tôi chỉ có thể lưu trữ độ sâu đối tượng phía trước nhất và sử dụng xác định cách tôi nên pha trộn các cuộc gọi vẽ tiếp theo ở pixel đó. Nhưng một lần nữa có một vấn đề, hãy nghĩ về hai mặt phẳng bán trong suốt với một mặt phẳng rắn ở giữa chúng. Tôi sẽ kết xuất mặt phẳng rắn ở cuối, người ta có thể thấy mặt phẳng xa nhất. Lưu ý rằng tôi sẽ hợp nhất mỗi hai mặt phẳng cho đến khi chỉ còn một màu cho pixel đó. Rõ ràng tôi cũng có thể sử dụng các phương pháp sắp xếp vì những lý do tương tự mà tôi đã giải thích ở trên.

  • Cuối cùng, điều duy nhất tôi tưởng tượng là có thể hoạt động là kết xuất tất cả các đối tượng thành các mục tiêu kết xuất khác nhau và sau đó sắp xếp các lớp đó và hiển thị đầu ra cuối cùng. Nhưng lần này tôi không biết làm thế nào tôi có thể thực hiện thuật toán này.

Câu trả lời:


11

Câu trả lời ngắn

Nhìn vào lột sâu . Từ nghiên cứu của tôi, nó dường như là sự thay thế tốt nhất, mặc dù tính toán tốn kém vì nó đòi hỏi nhiều lần kết xuất. Đây là một triển khai gần đây và nhanh hơn , cũng của NVIDIA.

Câu trả lời dài

Đó là một câu hỏi khó . Hầu hết các cuốn sách tôi đã đọc lướt qua chủ đề và để lại tại:

Bắt đầu bằng cách hiển thị tất cả các đối tượng mờ đục và sau đó trộn các đối tượng trong suốt lên trên chúng theo thứ tự từ trước ra sau.

Nói dễ hơn làm, bởi vì cách tiếp cận rõ ràng của việc sắp xếp các đối tượng theo trọng tâm của chúng không đảm bảo thứ tự sắp xếp chính xác.

Đó chính xác là cùng một vấn đề tại sao thuật toán của họa sĩ không hoạt động trong trường hợp chung và cần có bộ đệm sâu .

Như đã nói, một trong những cuốn sách tôi có đề cập đến một vài giải pháp:

  • Độ sâu lột - một giải pháp đa vượt qua giới hạn bộ đệm sâu bằng cách cung cấp cho chúng tôi các mảnh gần nhất thứ n, không chỉ là mảnh gần nhất. Ưu điểm lớn nhất là bạn có thể kết xuất các đối tượng trong suốt theo bất kỳ thứ tự nào và không cần phải sắp xếp. Nó có thể tốn kém vì nhiều lần vượt qua nhưng liên kết tôi đưa ra ở đầu dường như cải thiện hiệu suất.

  • Bộ đệm K-Bộ định tuyến của stt - Sử dụng định tuyến stprint để chụp nhiều lớp mảnh trên mỗi pixel trên mỗi hình học. Nhược điểm chính là các mảnh cần được sắp xếp trong một quá trình xử lý hậu kỳ.

Nó cũng đề cập đến một giải pháp phần cứng cho vấn đề này, nhưng tôi không nghĩ nó thực sự có sẵn:

  • F-Buffer - Bộ đệm FIFO theo thứ tự rasterization để kết xuất nhiều đường chuyền. Tuy nhiên, một bài đọc tốt và phần giới thiệu cũng nói một chút về vấn đề sắp xếp thứ tự minh bạch và các giải pháp hiện tại.

Các cách giải quyết khác không mang lại kết quả hoàn hảo nhưng tốt hơn là không có gì:

  • Sau khi render mọi đối tượng đục, tiếp tục sử dụng Z-đệm thử nghiệm cho các đối tượng trong suốt nhưng vô hiệu hóa bằng văn bản Z-buffer . Bạn có thể nhận được một số đồ tạo tác từ việc sắp xếp không chính xác nhưng ít nhất tất cả các đối tượng trong suốt sẽ hiển thị.

Và trích dẫn whitepaper F-buffer ở trên:

Giải pháp đơn giản nhất là hiển thị từng đa giác trong suốt một phần hoàn toàn độc lập (nghĩa là hiển thị tất cả các đường chuyền của nó trước khi chuyển sang đa giác tiếp theo). Giải pháp này thường rất tốn kém do chi phí thay đổi nhà nước phát sinh. Ngoài ra, ứng dụng hoặc thư viện tô bóng có thể nhóm các đa giác để đảm bảo rằng chỉ các đa giác không chồng lấp được hiển thị cùng nhau. Trong hầu hết các trường hợp, giải pháp này cũng không hấp dẫn, bởi vì nó yêu cầu phần mềm thực hiện phân tích không gian màn hình của đa giác.


11

Câu trả lời đúng là # 1: sắp xếp tất cả mọi thứ của bạn theo chiều sâu và hiển thị chúng (rõ ràng là tắt viết sâu, nhưng không kiểm tra). Một "điều" là gì?

Mỗi "vật" phải là một vật lồi; nó không thể tự chồng lên nhau. Nếu bạn có một vật thể lõm, do đó nó phải được chia thành các mảnh lồi.

Đây là những cách tiêu chuẩn của rendering một cảnh trong suốt. Liệu nó có giải quyết các trường hợp xen kẽ? Không. Nó có giải quyết các trường hợp bạn có 3 đối tượng không xác định được thứ tự độ sâu không? Không. Nó có giải quyết các trường hợp bạn có một vật thể dài chồng lên một vật nhỏ gần với độ sâu trung tâm của nó không? Không.

Nhưng nó hoạt động đủ tốt . Trò chơi không sử dụng lột sâu. Họ không sử dụng bộ đệm k-stpson định tuyến. Họ không sử dụng bộ đệm F. Tại sao? Bởi vì những điều này là vô cùng chậm.

Bạn có thể nhận được các tạo tác với phương pháp tiêu chuẩn. Nhưng ít nhất trò chơi của bạn chạy hợp lý nhanh.

Nếu bạn sẵn sàng giới hạn bản thân với DX11 hoặc phần cứng tốt hơn, có nhiều cách để thực hiện pha trộn với phân loại thích hợp. Chúng chậm hơn, nhưng không chậm như các kỹ thuật trước. Và không giống như lột sâu có thể giới thiệu các tạo tác, cái này là chính xác mẫu. Thêm vào đó, hiệu suất của thuật toán nói chung là trên mỗi phân đoạn (và ở một mức độ nào đó cho mỗi sự chồng chéo trong mỗi phân đoạn). Vì vậy, nếu bạn không vẽ nhiều thứ trong suốt, hiệu suất là tối thiểu.

Tôi không biết liệu kỹ thuật này có phải là một tên khó hiểu hay không, nhưng có thể tìm thấy một triển khai cho tiền GL4.2 ở đây. thể tìm thấy phiên bản D3D11 tại đây (Powerpoint, PPSX, tương thích Libre).


Điểm tốt về câu trả lời này. Cá nhân tôi cũng giải quyết đủ tốt (mà tôi đã mô tả về câu trả lời của mình, như là một cách giải quyết) vì hầu hết các kỹ thuật tôi liệt kê có lẽ rắc rối hơn giá trị của chúng. Ngoài ra, kỹ thuật thú vị cuối cùng, tôi không nghĩ rằng nó đã được liệt kê trên Kết xuất thời gian thực mà tôi đã nghiên cứu câu trả lời của mình. Tôi là một người mới hoàn toàn khi nói đến các tính năng cấp độ DX11.
David Gouveia

"Có thể tìm thấy một triển khai cho tiền GL4.2 tại đây" 404
Jeroen van Langen
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.