Vì bạn đã hỏi kinh nghiệm, đây là của tôi.
Quay trở lại những ngày khi tôi đang lập trình các trò chơi PS2, cách tiếp cận "các lớp alpha alpha" là cách mà chúng tôi thường thực hiện sương mù. Thỉnh thoảng là sương mù mặt đất, nhưng phổ biến hơn nhiều là sương mù toàn màn hình. Và nó hoạt động tốt trong cả hai trường hợp. Vì vậy, có, nó là khả thi trong những ngày trước mảnh vỡ.
Vâng, loại. Vấn đề, như bạn đã lưu ý, là nếu bạn muốn có sương mù mịn như nhìn thấy trong ảnh chụp màn hình, bạn cần một số lượng alpha quads khá vô lý.
Trên PS2, chúng ta thường có thể mua ở đâu đó giữa ba và năm lớp. Mà chắc chắn trông giống như "bức tường" sương mù lơ lửng trước mặt bạn. Hơn thế nữa và tỷ lệ lấp đầy bắt đầu giết chết tốc độ khung hình của chúng tôi.
Thông thường, các hình tứ giác này sẽ được vẽ ở khoảng cách cố định trước máy ảnh, vì vậy bạn không bao giờ gặp phải tình huống mà bạn đề cập, "đi qua" một trong số chúng. Mặt khác, bằng cách sử dụng những khoảng cách cố định đó, mọi thứ khác trên thế giới đều làmđi qua những chiếc máy bay đó khi người chơi di chuyển xung quanh, đó là một trục trặc đồ họa khá rõ ràng. Hầu như tất cả mọi người đã làm điều đó trước đó, nhưng bây giờ nó sẽ không được chấp nhận (trừ khi bạn làm điều đó vì lý do phong cách). (Ngoại lệ: một số người đã tính toán các giá trị sương mù như là một phần của trình tạo bóng đỉnh của PS2. Nó hoạt động và nhanh hơn nhiều, nhưng yêu cầu các mô hình của bạn phải được vận chuyển cao. Ví dụ, bạn không thể có những bức tường dài được tính toán ở các góc của bức tường, và sau đó bị nhòe trên toàn bộ mặt tường. Bức tường dường như bị mờ hoàn toàn nếu bạn đứng ngay bên cạnh, chẳng hạn, vì nó chỉ kiểm tra mức độ sương mù ở đó điểm cuối)
Lưu ý rằng nếu bạn đặt tứ giác sương mù tĩnh trên thế giới (như bạn có thể đề cập), thì bạn sẽ không thể có được sự xuất hiện của sương mù cực kỳ mịn, như trong hình ảnh bạn cung cấp - sẽ có sự chồng chéo kỳ lạ giữa Quads liền kề tùy thuộc vào định hướng của người xem. Những phần trùng lặp này có thể xuất hiện dưới dạng sọc hoặc hình thang (nếu hình tứ giác không có kết cấu) hoặc dưới dạng khối (nếu chúng có kết cấu).
Nhưng chúng ta hãy giả sử rằng chúng ta đang sử dụng các hình tứ diện rộng, màn hình để thực hiện sương mù mặt đất này và thực hiện một số tính toán về cách tạo ra sương mù thực sự mịn bằng phương pháp này, trên mặt đất bằng phẳng, với một camera nhìn thẳng về phía trước - đó là tình huống lý tưởng của chúng tôi . Giả sử độ phân giải HD: 1920x1080, đặt đường chân trời của chúng ta ở đường quét 540. Chúng ta cũng giả sử rằng chúng ta có thể nhìn thấy tất cả các đường chân trời (nghĩa là giả sử rằng bạn không có sương mù đạt đến độ mờ hoàn toàn trước khi đến chân trời). Với một quad quad sương mù bắt đầu và một dừng ở mỗi đường quét (để có được sương mù mịn), chúng ta cần (540 * 2 ==) 1080 quads sương mù. Mỗi trong số 1080 hình sương mù này sẽ bao phủ toàn bộ phần mở rộng theo chiều ngang của màn hình,
Hãy ước tính thấp và nói rằng trung bình, một mặt phẳng sương mù sẽ bao phủ khoảng 300 hàng pixel. Những cái gần nhất sẽ che ít hơn, những cái xa nhất sẽ che ít hơn, các hàng giữa sẽ bao phủ nhiều hơn.
Với ước tính đó, chúng tôi nhận được (1920x300 ==) 576.000 pixel được chạm vào bởi tứ giác sương mù trung bình. Tổng cộng, đó là (576.000 * 1080 ==) 622.080.000 pixel được chạm tổng cộng cho toàn bộ "sương mù mịn thông qua kết xuất nhiều hiệu ứng hình học mờ". Và con số đó sẽ tăng lên cho những người chạy ở độ phân giải cao hơn. Và hơn thế nữa, chúng ta có cùng số lượng thử nghiệm đối với bộ đệm z và gần như cùng một số thao tác trộn pixel, vì tất cả các lớp trong suốt này lặp đi lặp lại. Đó là rất nhiều pixel.
Và đó là trường hợp tốt nhất - bạn sẽ nhận được phạm vi bao phủ màn hình nhiều hơn nữa của các màn sương mù nếu người dùng nhìn xuống hoặc cúi xuống.
Lưu ý rằng vì chúng tôi chồng chéo 1080 góc, có lẽ chúng tôi muốn giá trị alpha khoảng (1.0 / 1080 ~ =) 0.0009 được đặt trên mỗi khối, để sương mù của chúng tôi đạt đến độ mờ hoàn toàn nếu bạn xem qua tất cả 1080 góc. (Chúng tôi có thể tăng cao hơn thế, nhưng đây là giá trị giả định rằng chúng tôi muốn trải rộng phạm vi xung quanh càng nhiều càng tốt). Lưu ý rằng giá trị này không thể được biểu diễn dưới dạng thành phần alpha của giá trị màu 32 bit (256 * 0,0009 ~ = 0,237 và do đó sẽ được làm tròn xuống 0 nếu bạn thử). Bạn sẽ cần cung cấp giá trị 0,0009 cho OpenGL dưới dạng giá trị dấu phẩy động để điều này hoạt động hoàn toàn. (Cũng lưu ý rằng bạn sẽ không thực sự muốn đặt cùng một giá trị này - trong khi chúng tôi xác định rằng chúng tôi muốn một hình tứ giác bắt đầu và một để kết thúc trên mỗi đường quét bên dưới đường chân trời để tạo cho chúng tôi sương mù mịn màng,
Cũng lưu ý rằng pha trộn sương mù sẽ không hoạt động hoàn toàn chính xác khi sử dụng phương pháp này, giống như với trình đổ bóng hiện đại - thay vì nhận một phép tính "pha trộn giữa màu đối tượng cơ sở và màu sương mù bằng tỷ lệ phần trăm này", bạn nhận được 1080 tính toán "pha trộn giữa màu sắc cho đến nay và màu sương mù theo tỷ lệ sương mù". Điều đó có nghĩa là sương mù sẽ ảnh hưởng đến các vật thể sau sự sụp đổ logarit. (Nghĩa là, một vật thể bị ảnh hưởng bởi 20 góc sương mù sẽ xuất hiện ít hơn hai lần so với sương mù bị ảnh hưởng bởi 10 góc sương mù, bởi vì các sương mù đầu tiên có tác động nhiều hơn trong hoạt động pha trộn).
Tất cả những điều đó là để nói: Xin vui lòng chỉ sử dụng một shader mảnh.
Không, thực sự. Nó đơn giản hơn và rẻ hơn, nhanh hơn và nhanh hơn để thực hiện và ít bị lỗi hơn và cho phép bạn quay lại thực sự làm cho trò chơi của mình và tốt hơn theo mọi cách có thể. Chúng tôi hoàn toàn sẽ làm điều đó trở lại trong kỷ nguyên PS2 nếu điều đó thậm chí còn mơ hồ vào thời điểm đó.