Sự phù hợp của sương mù mặt đất bằng cách sử dụng các lớp alpha alpha?


16

Một cách tiếp cận nhiều lớp sẽ sử dụng một loạt các hình tứ giác có kết cấu alpha khổng lồ được bố trí song song với mặt đất, giao với tất cả các hình dạng địa hình can thiệp, để tạo ra ảo ảnh của sương mù mặt đất khá hiệu quả từ trên cao, nhìn xuống và có phần kém hiệu quả hơn khi ở trong sương mù và nhìn về phía chân trời (xem hình bên dưới).

Ngoài ra, một cách tiếp cận chủ yếu dựa trên shader thay vào đó sẽ tính mật độ là hàm của khoảng cách xem vào chất nền sương mù mặt đất và đưa ra giá trị mảnh dựa trên đó.

Không cần phải tự kiểm tra hiệu suất từng cách tiếp cận , trước tiên tôi muốn nghe kinh nghiệm của người khác (không phải suy đoán!) Về loại hiệu suất nào tác động đến phương pháp kết cấu alpha nhiều lớp có thể có. Tôi yêu cầu cụ thể do các tác động được trích dẫn từ việc rút tiền (không chắc mức độ lấp đầy ràng buộc hệ thống máy tính để bàn trung bình của bạn như thế nào). Một danh sách các trò chơi sử dụng phương pháp này, đặc biệt là các trò chơi cũ hơn, sẽ vô cùng hữu ích: nếu điều này khả thi trên phần cứng trước DX9 / OpenGL2, nó có khả năng hoạt động tốt với tôi.

Một câu hỏi lớn liên quan đến loại hiệu ứng này:

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

(Tín dụng hình ảnh được chuyển đến Lume of lume.com)

Lưu ý cách phân loại sương mù dọc là liên tục / trơn tru. OTOH, sử dụng các lớp bốn kết cấu, tôi chỉ có thể giả định rằng các lớp sẽ rất rõ ràng khi đi qua chúng - chúng càng thưa thớt thì điều này càng rõ ràng. Điều này trái ngược với nơi các mặt phẳng sương mù được căn chỉnh để đối mặt với người chơi mọi khung hình, trong đó độ thô này sẽ ít rõ ràng hơn nhiều.


1
Tại sao bạn muốn sử dụng alpha quad layer cho việc này? "Cách tiếp cận nặng về bóng" không chỉ chính xác hơn, mà còn không chính xác được biết là chậm .
Nicol Bolas

1
@StephanvandenHeuvel Chắc chắn, nhưng đó là sương mù dựa trên không gian, phù hợp với không gian. Không sương mù mặt đất. Chính xác?
Kỹ sư

1
@NickWiggill Vâng, bạn đã đúng.
Stephan van den Heuvel

1
IIRC, Wii có sương mù thẳng hàng trên mặt đất trong đường ống cố định (bán). Rõ ràng glFogCoordphần mở rộng trong OpenGL kế thừa cũng cho phép làm điều đó . Mặc dù nghe có vẻ hạn chế: đó là dựa trên mặt đất hoặc dựa trên khoảng cách.
Laurent Couvidou

1
Quake 3 đã làm một cái gì đó tương tự như vậy, bằng cách sử dụng phương pháp đường ống cố định hoạt động với GL1.1. Mối quan tâm lớn mà tôi có là việc điền / rút tiền có thể chồng chất xấu, nhưng có lẽ đáng để tải xuống mã nguồn Q3 và xem xét việc thực hiện chúng; bạn có thể không làm chính xác như vậy nhưng ít nhất nó có thể giúp bạn đưa ra quyết định.
Maximus Minimus

Câu trả lời:


15

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 đó.


1
+1 cho câu trả lời toàn diện dựa trên kinh nghiệm thực tế.
Concept3d

3
Một năm và một tháng trước khi tôi viết câu hỏi này, tôi vẫn sẵn sàng chơi gà với tỷ lệ lấp đầy. Bây giờ tôi sẽ chọn một kết cấu 3D thô để thể hiện khối lượng sương mù mặt đất với mật độ thay đổi liên tục được xác định bằng tiếng ồn perlin 3D, và sau đó sử dụng nó làm cơ sở cho các hiệu ứng không gian màn hình, như bạn đã đề xuất.
Kỹ sư
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.