Làm cách nào để triển khai trình kết xuất ánh sáng 2D thời gian thực với ánh sáng sương mù / màu trên GPU?


7

Từ lâu tôi đã muốn thực hiện thuật toán sét 2D dựa trên một ý tưởng tôi thấy trên YouTube . Video là thời gian thực, nhưng nó chạy trên CPU và độ phân giải khá thấp. Tôi tò mò liệu có ai có ý tưởng làm thế nào để làm điều này trên GPU không.

Thuật toán hoạt động theo cách sau:

  • Chúng tôi có bản đồ dữ liệu ánh sáng, những bản đồ này giữ màu của vật liệu (ví dụ: kính màu đỏ có 0xFF0000) và pixel đó trong suốt như thế nào.
  • Tính toán các giá trị ánh sáng của từng pixel trong các vòng tròn đang phát triển từ một nguồn sáng. Nói cách khác, trước tiên hãy tính các giá trị ngay bên cạnh ánh sáng (8 pixel), sau đó là các lân cận của các pixel này, v.v. Màu của pixel là giá trị của nó từ bản đồ dữ liệu sét, alpha của nó bằng: (alpha của pixel bên cạnh nó gần nhất với nguồn sáng - alpha của riêng nguồn sáng). Vì vậy, nó là một số loại thuật toán đúc tia tính toán giá trị cho từng pixel và có thể xử lý kính màu và sương mù / khói.

Vì vậy, việc thực hiện CPU là khá nhỏ. Vấn đề của tôi là tôi muốn sử dụng nó trong một trò chơi di động, nhưng tôi không biết làm thế nào nó sẽ hoạt động như một shader. Làm thế nào điều này có thể được thực hiện trên GPU (sẽ chạy trên thiết bị di động, vì vậy với OpenGL ES 2.0 / 3.0, có thể với Metal - nếu điều này là không thể thì với OpenCL / CUDA)?

Lưu ý: Tôi không tìm kiếm các triển khai đầy đủ, chỉ là các ý tưởng / mã giả shader làm thế nào điều này sẽ có thể.

Câu trả lời:


6

Nếu hình học trên tường của bạn là đồ họa vector, bạn có thể chỉ cần đưa phân đoạn ra khỏi vị trí ánh sáng. Điều này có nghĩa là 2 hình tam giác trên mỗi lệnh gọi rút thăm, tất cả các độ lệch đùn có thể được xử lý trong trình tạo bóng đỉnh.

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

Hình 1 : Đối với mỗi bức tường tạo ra một khối đùn bóng.

Thực hiện mẫu nhanh và cực kỳ bẩn của khối lượng bóng ở đây:

Bây giờ vì shader của bạn có thể tô màu các hình tam giác khi chúng thấy phù hợp, bạn có thể áp dụng một shader trên các hình tam giác được tô màu. Giống như bạn sẽ làm cho bề mặt trong suốt. Để làm điều này đúng, bạn có thể cần một bộ đệm ngoài màn hình để có được chế độ tích lũy màu thích hợp.

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

Hình 2 : Tô màu các khối dựa trên khoảng cách với ánh sáng.

Chắc chắn thuật toán tô màu có thể là bất cứ điều gì bạn thích. ví dụ màu sắc có thể trở nên tối hơn khi bạn ở gần cạnh cực hơn, v.v.

Và đây là ví dụ trực tiếp cực kỳ bẩn về khối lượng bóng màu:

  • http://webglplayground.net/satted/9xgxDbtY7f (vui lòng không lưu phiên bản của riêng bạn, thay vào đó), kiểu mã rất tệ được thực hiện trên đường chạy (và trên điện thoại của tôi).

Đây chỉ là một cách hy vọng những người khác sẽ làm sáng tỏ. Bạn cũng có thể sử dụng các phương pháp chính xác giống như trong 3d. Đối với sương mù không hình thành, bạn chỉ có thể sử dụng raymarcher.


Cảm ơn câu trả lời! Nhưng tôi không tìm kiếm một thuật toán đổ bóng 2D đơn giản (có rất nhiều trên web), tôi đang tìm kiếm một thuật toán bóng / ánh sáng có thể xử lý sương mù thể tích và các bề mặt trong suốt có màu (như trong video Youtube).
sydd

@sydd đó chỉ là một shader trên khối lượng bóng. Dễ dàng mở rộng.
joojaa

@sydd đã thêm ví dụ màu
joojaa

cảm ơn, nó trông thật tuyệt Nhưng khi tôi viết bài viết của mình là về việc chuyển thuật toán mà tôi đã mô tả cho GPU. Trên thực tế, ai đó đã đưa ra câu trả lời về SO tại stackoverflow.com/questions 432708021 / . Câu trả lời này là những gì tôi đang tìm kiếm, nhưng nó chậm, vì vậy tôi không nghĩ rằng thuật toán này là khả thi cho một trò chơi thực sự.
sydd

@sydd raycasting có thể được tăng tốc bằng cách tính toán trước dữ liệu vào cơ sở hạ tầng tốt hơn.
joojaa
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.