Làm thế nào tôi có thể thực hiện ánh sáng dựa trên gạch mịn?


8

Tôi đã làm việc trên một trò chơi xếp hình 2D và tôi đã thực hiện chiếu sáng khó:

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

Tôi muốn nó được làm mịn một chút. Tôi không cần bóng hoặc bất cứ thứ gì, chỉ cần ánh sáng đơn giản. Tôi muốn nó trông giống như thế này:

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

Hệ thống hiện tại của tôi sử dụng các mức độ ánh sáng cho từng ô trên thế giới và chúng được tính toán lại, khi một ô được đặt hoặc gỡ bỏ. Tôi đang sử dụng batch.setColor(...)để che bóng gạch. Một cách tốt để đạt được ánh sáng mịn này là gì?

Tôi không muốn sử dụng phương pháp lớp phủ ánh sáng, tôi đã thử nó và tôi không hài lòng với kết quả này. Tôi muốn có thể đặt bao nhiêu ánh sáng có thể đi qua một khối. Để kiểm tra một khối bụi bẩn nên hấp thụ một phần ánh sáng, nhưng một khối thủy tinh không nên chặn bất kỳ ánh sáng nào. Điều này là không thực sự có thể với phương pháp lớp phủ ánh sáng. CẬP NHẬT: Tôi đã hiểu sai phương pháp này thực sự là gì. Giờ thì tôi đã hiểu. Tôi đã suy nghĩ sai lầm. Lấy làm tiếc!


Thành thật mà nói, nó trông phong cách hơn với ánh sáng cứng.
S. Tarık Çetin

Tôi không thích nó nhiều, cũng hơi khó để phân biệt gạch nền và gạch nền trước với phong cách này.
Dự kiến

Câu trả lời:


15

Một cách đơn giản để đạt được ánh sáng mượt mà trong trò chơi xếp gạch, là vẽ "ánh sáng" cho mục tiêu kết xuất, và sau đó vẽ mục tiêu kết xuất này lên trên cảnh của bạn trong khi trộn alpha.

Mục tiêu kết xuất bản đồ ánh sáng của bạn sẽ là kích thước của bản đồ ô vuông của bạn, nhưng tính bằng pixel. Mỗi pixel sẽ đại diện cho màu sáng của ô tương ứng. Kết cấu kết xuất này sẽ trông giống như thế này (kết cấu trên cùng bên trái màu đen và trắng):

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

Khi bạn có kết cấu bản đồ ánh sáng này, bạn có thể vẽ nó dưới dạng lớp phủ trên thế giới trò chơi của bạn (kéo dài ra). Bạn sẽ phải kẹp nó đúng cách, để nó trải dài hoàn toàn trên gạch của bạn trong thế giới trò chơi.

Sau đó, vấn đề là pha trộn kết cấu alpha này vào thế giới trò chơi của bạn trong libGDX. Để pha trộn LibGDX (cá nhân tôi không biết làm thế nào), bạn có thể phải xem xét Gdx.gl.glBlendFuncchức năng.


2
Bạn có thể điều khiển ánh sáng theo cách bạn muốn với hệ thống này. Không chắc chắn những gì bạn đang đề cập đến khi bạn nói rằng bạn không thể chặn ánh sáng. Ngoài ra, không hoàn toàn chắc chắn làm thế nào bạn có kế hoạch để làm mịn hệ thống hiện tại của bạn, vì bạn thực sự chỉ là tô màu gạch của bạn.
jgallant

4
Nhân tiện, hệ thống này là cách Starbound thực hiện.
Qqwy

2
Đây là một cách tiếp cận tuyệt vời, và cho phép linh hoạt khi cần thiết. Tôi sử dụng điều này trong trò chơi xếp gạch của mình, nơi tôi không có quyền truy cập vào shader và nó hoạt động rất tốt!
Tyyppi_77

1
CẬP NHẬT : Đây có vẻ là cách để đi, tôi đã hiểu sai phương pháp này và bây giờ tôi đã hiểu đầy đủ! Tôi sẽ cố gắng thực hiện phương pháp này ngay bây giờ và tôi sẽ đánh dấu đây là câu trả lời tốt nhất và cung cấp cho bạn tiền thưởng!
Dự kiến

2
Nếu bạn có thêm câu hỏi về cách làm, hãy hỏi. Tôi đã thực hiện điều này và @ Tyyppi_77 cũng gần đây. Tôi đã thực hiện nó trong XNA / Monogame và Unity. Tyyppi đã thực hiện nó trong SDL.
jgallant

4

một cách bất khả tri của động cơ để làm điều đó là sử dụng ánh xạ ánh sáng trung bình. Trước tiên, bạn cần tạo một bản đồ đen trắng dưới dạng một mảng booleans 2D có kích thước của thế giới nơi các khối là Đúng và trống là Sai.

Giống như thế này (1 là màu đen, 0 là màu trắng): bản đồ

Sau đó, bạn cần tạo một mảng 2D mới có cùng kích thước với mảng đầu tiên nhưng là một mảng nổi. Sau đó, bạn chuyển từ khối đen (True) sang khối đen trong mảng và lấy giá trị lấy mẫu gần đó (giải thích bên dưới)

Hình ảnh này sẽ giúp: tính trung bình

Hình ảnh này đại diện cho việc lấy mẫu (trong đó + có nghĩa là sai và | có nghĩa là đúng). những gì chúng ta làm là coi giá trị True là 1 và giá trị Sai là 0. Sau đó, bạn lấy trung bình 9 số và đặt nó vào phần chính xác của mảng. LƯU Ý: Đảm bảo rằng khi bạn lấy mẫu các cạnh, bạn sử dụng coi các giá trị bên ngoài là phân biệt ngữ cảnh. Ví dụ: ngầm bản đồ bên ngoài thế giới có thể là 1 và bầu trời nên là 0.

Nó sẽ trông như thế này (lấy từ bài khác):kết thúc

Sau đó, tất cả những gì bạn phải làm là nhét từng khối trong mảng với

rgba(tint,tint,tint,1)

(tint = giá trị khối trung bình hiện tại trong mảng thứ hai và alpha không thành vấn đề). Lưu ý: điều này giả định rằng rgba chức năng giả sẽ nổi từ 0-1 thay vì 0-255, nếu có, chỉ cần làm điều này:

rgba(tint*255,tint*255,tint*255,255)

Hy vọng điều này có ý nghĩa một chút :) Nếu bạn muốn mã, xin hỏi!


Nắm tay cảm ơn câu trả lời của bạn, nhưng điều là tôi đã có ánh sáng cạnh cứng trong trò chơi của tôi ( ở đây ). Tôi hỏi làm thế nào tôi có thể thay đổi điều này để trông mượt mà hơn ( như thế này )
ProRed

1

Vì bạn đang nói về những thứ cản ánh sáng, tôi giả sử bạn có một số mô hình về cách ánh sáng nên lan rộng. Ví dụ, mọi thứ không có khối phía trên nó đều được thắp sáng hoàn toàn, ánh sáng lan sang tất cả các ô lân cận nhưng mất đi một lượng sáng nhất định.

Bạn sẽ có thể thực hiện các quy tắc đó khá dễ dàng ở phía phần mềm, ít nhất là phần làm mịn sau đó chỉ là vấn đề ném một số shader vào bản đồ ánh sáng bạn đã tạo.

Các phương pháp mà người khác đã đề xuất với việc phủ lên bản đồ ánh sáng là điều bạn nên làm bằng mọi cách. Nhưng bạn có thể thay đổi cách bạn tạo bản đồ ánh sáng này. Ban đầu, bạn có thể điền thông tin đó chỉ bằng thông tin khối, nhưng sau đó bạn có thể mở rộng nó và làm mịn nó trong một shader chẳng hạn. Một lợi ích bổ sung của phương pháp bản đồ ánh sáng là bạn có thể chỉ cần vẽ ánh sáng động vào bản đồ ánh sáng của mình để làm nổi bật vụ nổ hoặc những gì có bạn và nó sẽ hòa trộn một cách tự nhiên với phần còn lại của thế giới.

Công cụ pha trộn phụ gia vào bản đồ ánh sáng của bạn sau đó nhân số pha trộn ánh sáng của bạn với thế giới trò chơi.

Tôi đã làm điều này một thời gian trước đó sử dụng các nguyên tắc tương tự. Hệ thống này không hỗ trợ việc giảm ánh sáng khác nhau đối với các loại địa hình khác nhau, nhưng ít nhất nó sẽ minh họa cho tính hữu ích của việc phủ lên bản đồ ánh sáng.


Tôi hiểu rồi, vậy tôi sẽ kết xuất các mức ánh sáng dưới dạng hình chữ nhật có kích thước chính xác bằng ô tương ứng với mục tiêu kết xuất thứ hai? Và làm thế nào tôi sẽ đi về làm mịn nó ra?
Dự kiến

Bạn có thể để GPU xử lý nó bằng cách lấy mẫu xuống, vì khi kết xuất nó sẽ chỉ nội suy tuyến tính cho bạn. Nếu điều đó không đủ tốt, bạn có thể tạo ra một số vệt mờ trên nó trong một shader. Bạn cũng có thể xem xét để hiển thị ở độ chi tiết mịn hơn độ phân giải của gạch nếu bạn muốn vẽ nó khác nhau tùy thuộc vào các ô liền kề. Về cơ bản, phần cứng được đưa ra với các quy tắc cụ thể mà bạn muốn cho khu vực nào sẽ được thắp sáng bao nhiêu. Nếu bạn viết những quy tắc đó xuống, bạn thường sẽ tìm thấy một cách khá đơn giản để làm điều đó.
Nils Ole Timm

1

Thật dễ dàng cho một ngọn đuốc: sử dụng trình đổ bóng pixel tùy chỉnh, bạn tính khoảng cách giữa mỗi mảnh và ngọn đuốc; sau đó bạn có thể tính toán nơi gạch dày đặc đầu tiên chặn ánh sáng phát ra từ ngọn đuốc. Sau đó, bạn tính khoảng cách mà ánh sáng không bị chặn, nhân với khoảng cách <1 để ngọn đuốc không thắp sáng mặt trời, trừ đi từ tổng khoảng cách và lặp lại cho phần còn lại của khoảng cách (nơi ánh sáng bị chặn bởi ít nhất một ô) với giá trị nhân nhỏ hơn ... Tôi biết cách thực hiện phép toán này và nó không quá phức tạp để thực hiện trong opengl.

EDIT: đối với một nguồn sáng đơn giản với một điểm trung tâm cụ thể, phương pháp của tôi cực kỳ đơn giản. Tuy nhiên, tôi không hoạt động với ánh sáng mặt trời, nhưng trong khi bản đồ alpha hoạt động rất tốt với ánh sáng mặt trời, thì đó không phải là ý tưởng hay cho một ngọn đuốc, vì nó có khả năng là một vật thể chuyển động và tạo ra một bản đồ mới, mọi khung hình đều không dễ chịu Trải nghiệm sống. Theo tôi, giải pháp tốt nhất là kết hợp: tính toán khoảng cách cho các đèn cụ thể thực sự là các vật thể trong trò chơi, một shader riêng mà bạn vừa ném lên trên bản đồ alpha mà bạn đã tạo theo cách thủ công bằng cách sử dụng kỹ thuật được đề cập ở trên: một kết cấu của tất cả các bảng chữ cái gạch từ bóng mờ cứng của bạn, như nhiều hình vuông, và lộn xộn với các kỹ thuật để làm cho nó trơn tru.


0

Kết xuất của bạn có sử dụng màu đỉnh (hoặc bạn có thể thay đổi nó) không?

Giả sử mỗi khối là một hình vuông 4 đỉnh, sẽ cung cấp cho bạn một vài tùy chọn, ví dụ:

Nếu thuật toán chiếu sáng hiện tại của bạn cung cấp cho bạn một giá trị ánh sáng trên mỗi khối, bạn có thể thay đổi nó để cung cấp cho bạn một giá trị trên mỗi đỉnh. Thay phiên, ở mỗi đỉnh bạn có thể lấy trung bình màu sáng của khối hiện tại cộng với ba lân cận của nó. Hoặc là giải pháp sẽ không tốn kém.

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.