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:
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?
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ộ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:
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);