Sự tán xạ khí quyển và hình học bầu trời


7

Tôi đang cố gắng thực hiện phân tán khí quyển trong công cụ đồ họa (trò chơi) của mình dựa trên bài viết về GPU Gems: link . Một ví dụ thực hiện từ bài viết đó sử dụng skydome. Khung cảnh của tôi thì khác - tôi không tạo ra cả một trái đất với bầu không khí có thể nhìn thấy được từ không gian nhưng một số khu vực (hình chữ nhật) hữu hạn với các vật thể, ví dụ như một đường đua. Trong thực tế đây là kịch bản phổ biến nhất trong nhiều trò chơi. Bây giờ tôi tự hỏi làm thế nào để hiển thị một bầu trời trong trường hợp như vậy:

  1. Tôi nên sử dụng loại hình học nào: skydome, skybox hoặc quad toàn màn hình - sau đó tôi phải di chuyển gần như tất cả các tính toán sang shader mảnh, nhưng tôi không biết liệu nó có ý nghĩa về mặt chất lượng / hiệu suất không?

  2. Làm thế nào để đặt hình học bầu trời trên cảnh? Ý tưởng của tôi: Tôi có một hình học bán cầu (skydome) với bán kính = 1 và tâm trong vec3 (0, 0, 0) - trong không gian đối tượng. Những đỉnh đó được gửi đến shader đỉnh tán xạ khí quyển:

    layout (location = 0) trong vec3 inPocation; Tiếp theo, trong shader đỉnh tôi biến đổi đỉnh theo cách này:

    v3Pos = inP vị trí * 0,25f + 10,0f; Đồng phục v3CameraPos = vec3 (0.0f, 10.0f, 0.0f), đồng phục fInnerRadius = 10.0f, đồng phục fCameraHeight = 10.0f

Sau đó, tôi đã sửa một động cơ bán kính bên trong / bên ngoài (10 / 10,25), phải không? Tôi cũng gửi cho shader đỉnh một ma trận mô hình đặt vị trí của bán cầu với tư thế của máy ảnh di động vec3 (myCamera.x, myCamera.y, myCamera.z):

vec4 position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(inPosition, 1.0);
gl_Position = position.xyww; // always fails depth test.

Bán cầu di chuyển cùng với máy ảnh (chỉ bao gồm một số khoảng trống xung quanh máy ảnh có bán kính = 1, nhưng nó cũng luôn thất bại trong bài kiểm tra độ sâu.)

Thật không may, một màu trời mà tôi nhận được là không chính xác:

Màn hình1

  1. Một "đường cong bầu trời" thì sao? Đây là một bức tranh thể hiện điều tôi muốn nói:

hình ảnh1

Làm thế nào tôi nên thiết lập một đường cong bầu trời?

Edit1 - debugging: Trong shader đỉnh tôi đã gán cho vị trí v3Pos của đỉnh "cao nhất" ở bán cầu:

vec3 v3Pos = vec3(0.0f, 10.25f, 0.0f);

Bây giờ toàn bộ bầu trời chứa một màu của đỉnh đó: Màn hình2


3
Tôi nghĩ rằng câu hỏi của bạn bị mất giữa việc gỡ lỗi mã hiện tại của bạn và đề xuất những việc cần làm. Có lẽ việc đọc lại câu hỏi của bạn có thể giúp bạn có câu trả lời tốt hơn.
Concept3d

Câu trả lời:


1

Bạn cần chuyển các giá trị điều chỉnh của mình thông qua dữ liệu thống nhất và không phải dữ liệu đỉnh.

Dữ liệu Vertex luôn phức tạp hóa đường ống xuất khẩu và ràng buộc (chữ ký đầu vào).

Tôi khuyên dùng một quad màn hình cho hình học hỗ trợ của bầu trời và hiển thị nó ở cuối khung hình của bạn, khi tất cả các đối tượng khác được hiển thị, sử dụng thao tác kiểm tra độ sâu được cho là thất bại trong tất cả các thử nghiệm, do đó chỉ hiển thị các wholes. (bạn có thể sử dụng ma trận máy ảnh chỉnh hình đặc biệt cho điều đó, trong đó bạn biết đó 1là giá trị sâu nhất và bạn đặt quad màn hình của mình 0.99để tránh bị cắt xa, vì vẫn thất bại trong tất cả các bài kiểm tra độ sâu.)

Sau đó, nó sẽ là tối ưu trong hiệu suất, nó là một kỹ thuật kết xuất defered cổ điển. (không may với các vấn đề khử răng cưa cổ điển mà chúng ta biết)

Bạn cũng có thể sử dụng skycube hoặc skysphere, các công ty đã tình cờ sử dụng 3 kỹ thuật được mô tả ở trên, vì vậy nó không giống như có một câu trả lời phổ quát.


Tất cả các giá trị điều chỉnh được truyền qua dữ liệu thống nhất. Bạn đã sai về hình học bầu trời cho thuật toán tán xạ đó. Xem tại đây: gamedev.net/topic/ trên
Irbis

0

Tôi đã không giải quyết vấn đề này một cách cá nhân vì vậy tôi có thể đã bỏ lỡ rất nhiều sắc thái nhưng tôi đã quản lý một dự án nơi chúng tôi thực hiện mô hình phân tán này. Chúng tôi thực sự đã làm điều này hai lần, một lần cho một đường ống kết xuất phía trước và một lần nữa cho một đường ống chiếu sáng bị trì hoãn. Trong cả hai trường hợp, chúng tôi đã làm mọi thứ trong không gian màn hình với những dữ liệu động nhỏ mà chúng tôi cần tải lên dưới dạng hằng số đổ bóng và dữ liệu tĩnh được tính toán trước và mã hóa thành kết cấu 3d. Phiên bản chuyển tiếp được thực hiện như một bước của quy trình đăng bài (mặc dù điều này gây ra tất cả các loại đau đầu, đặc biệt là chiếu sáng các polys alpha không được thể hiện trong bộ đệm sâu). Trong thiết lập ánh sáng hoãn lại, chúng tôi đã thực hiện điều này như là một phần của việc vượt qua ánh sáng với ít vấn đề hơn.

Xin lỗi vì hơi mơ hồ nhưng hy vọng ít nhất là có sự giúp đỡ.

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.