Trong Minecraft khi bạn nhìn vào nước, bạn càng nhìn sâu hơn. Có ai biết làm thế nào để mã hóa một cái gì đó như vậy?
Minecraft có hiệu lực
trò chơi tương tự mà không có hiệu lực
Trong Minecraft khi bạn nhìn vào nước, bạn càng nhìn sâu hơn. Có ai biết làm thế nào để mã hóa một cái gì đó như vậy?
Minecraft có hiệu lực
trò chơi tương tự mà không có hiệu lực
Câu trả lời:
Về cơ bản có hai cách tiếp cận khác nhau để chiếu sáng nước dựa trên độ sâu:
Minecraft sử dụng ánh sáng dựa trên voxel, hoạt động bằng cách truyền ánh sáng đến các hình khối liền kề, giảm độ sáng tùy thuộc vào loại khối. Đại dương tối là một tác dụng phụ của hệ thống này.
Nước chặn ánh sáng mặt trời và giảm 3 mức ánh sáng cho mỗi khối (thay vì mức 1 mặc định), có nghĩa là độ sáng trong đại dương cho mỗi khoảng cách từ bề mặt là:
0 (surface): 15 (direct sunlight)
1: 12
2: 9
3: 6
4: 3
5 and below: 0 (darkness)
Nguồn: Minecraft Wiki - Ánh sáng
Trong các trò chơi với mô hình chiếu sáng truyền thống, hiệu ứng này có thể được tạo ra bằng cách đo lượng nước nằm giữa nguồn sáng và đáy đại dương. Ánh sáng sau đó bị mờ dần dựa trên khoảng cách này. Có một vài phương pháp để làm điều này:
Nếu bạn có một bề mặt phẳng, bạn có thể dễ dàng tính toán khoảng cách ánh sáng truyền trong nước nếu bạn vượt qua bề mặt bình thường khỏi mặt nước và sản phẩm chấm của bình thường này và một vị trí bề mặt vào bóng đổ hình học.
Khoảng cách nước hiệu quả là
nơi là vị trí của các đỉnh và là góc giữa hướng ánh sáng xuống mặt biển và mặt nước bình thường đối với cơ thể của nước.
Vào lúc hoàng hôn, chỉ đạt được ít hơn 50 ° vì ánh sáng bị khúc xạ khi xuống nước.
Đây là một bài đăng blog với một lời giải thích tốt: Máy ảnh kỹ thuật số: Tổng phản xạ nội bộ
Một bài đăng khác có nhiều chi tiết hơn: Máy ảnh kỹ thuật số: Định luật khúc xạ của Snell
Nếu bạn đang sử dụng sơ đồ chiều cao trên bề mặt song song với nước, sẽ trở thành . Hệ số đúng bằng 1 nếu mặt trời ở ngay trên mặt nước.
Với ánh sáng điểm, bạn phải tính toán cho từng đỉnh dựa trên vị trí tương đối với nguồn sáng.
Với mực nước cố định hoặc hướng sáng cố định, các phần của phương trình là không đổi và không nên tính toán trong bóng đổ vì lý do hiệu suất.
Nếu bạn hiển thị mặt nước thành một bản đồ độ sâu riêng biệt (nhìn từ nguồn sáng), bạn có thể sử dụng kết cấu độ sâu đó để tính khoảng cách ánh sáng đi trong nước trước khi chạm vào bề mặt.
Để thực hiện việc này, bạn chiếu từng đỉnh vào hình chiếu chế độ xem của nguồn sáng trong trình tạo bóng đỉnh và thực hiện tra cứu kết cấu trong trình đổ bóng pixel.
Nếu bề mặt tương đối bằng phẳng, bạn nên sử dụng nguồn sáng khúc xạ để có kết quả tốt hơn.
* Bạn có thể xác định lượng nước ở phía trước bề mặt rắn gần nhất bằng cách đếm độ sâu từ POV của ánh sáng như sau:
Kết cấu kết quả hiện chứa lượng nước phía trước ánh sáng trong không gian xem ánh sáng, do đó, giá trị phải được chuyển đổi trở lại trước khi bạn sử dụng nó. Phương pháp này hoạt động để tính toán ánh sáng định hướng (trừ khúc xạ), nhưng sẽ dẫn đến ánh sáng xung quanh không chính xác nếu các bề mặt rất không đều và có một lượng không khí lớn giữa các vùng nước ảnh hưởng đến cùng một mảnh.
Những ưu và nhược điểm giống như đối với ánh xạ bóng bình thường, ngoại trừ việc bạn cần thêm một bộ đệm trong khi tính toán độ sâu và hiệu suất kém hơn vì bạn phải vẽ thêm hình học.
Ray theo dõi là giải pháp chính xác nhất nhưng cũng tốn kém nhất để hiển thị khối lượng trong suốt. Có hai cách để làm điều này: 1. Truy tìm từ đáy đại dương về phía mặt nước và 2. Truy tìm từ nguồn sáng hướng về mặt nước. Cần nhiều tia cho mỗi điểm trên sàn để tính độ sáng.
Có một vài điều nữa cần tính đến khi kết xuất nước:
Ánh sáng trong nước bị tán xạ trở lại trong khi di chuyển đến người quan sát, vì vậy bạn nên pha trộn nó theo một màu đặc.
Nếu người quan sát bị ngập nước , bạn chỉ có thể kết xuất sương mù dựa trên kết quả cuối cùng của bộ đệm độ sâu. Màu sương mù, nhưng không phải mật độ của nó sẽ thay đổi theo khoảng cách của người quan sát so với bề mặt! (Minecraft chỉ sử dụng phần hiệu ứng này.)
Nếu người quan sát nhìn mặt nước từ trên cao , bạn cần tính toán sương mù dựa trên độ chênh lệch độ sâu giữa bề mặt và hình học dưới nước. Màu sương mù sẽ hơi tối hơn với độ chênh lệch độ sâu lớn hơn, nhưng chỉ nên thay đổi đến điểm sương mù mờ hoàn toàn.
Màu sương mù cũng phải phụ thuộc vào hướng xem của từng pixel, vì vậy nó hơi tối hơn khi nhìn xuống trong cả hai trường hợp.
Nếu bạn sử dụng kết cấu 3D ốp lát liền mạch thay vì decal cho tụ quang giả, bạn có thể tránh kéo dài trên các bề mặt thẳng đứng. Độ mạnh của ánh sáng tán xạ gần bề mặt thay đổi theo ba chiều, vì vậy sử dụng Kết cấu 2D thường tạo ra sự kéo dài ở đâu đó trong cảnh. Bạn có thể mô hình thay đổi góc ánh sáng bằng cách chiếu các vị trí đỉnh của sàn thành một hệ tọa độ khác.
Một khả năng khác là tính toán mật độ ánh sáng dựa trên vị trí bề mặt trong hệ tọa độ của ánh sáng, mặc dù điều đó rất có thể sẽ tốn một số hiệu suất.
Các tụ quang nên mờ dần nhanh hơn ánh sáng khuếch tán với độ sâu tăng dần.
Màu sắc được phân tán khác nhau, vì vậy màu sắc ánh sáng nên thay đổi theo chiều sâu tăng dần. Điều này cũng ngăn chặn các cạnh đột ngột, ví dụ, một bãi biển giao với mặt nước.
Do khúc xạ, ánh sáng chiếu xuống đáy đại dương dốc hơn nhiều so với bình thường. Các bài viết trên Wikipedia về định luật Snell có công thức cho các góc và vectơ.
Tôi tin rằng hiệu ứng ánh sáng bầu trời trong Minecraft là thẳng xuống - mọi thứ bị che mờ bởi những gì ở trên chúng cho dù mặt trời ở đâu. Sau đó, ánh sáng cục bộ từ các ngọn đuốc, v.v ... được áp dụng với hiệu ứng thả xuống - càng xa nguồn sáng, khối lập phương càng ít ánh sáng.
Nếu được thực hiện theo cách này, mỗi lớp nước sẽ tích tụ lớp bên dưới nó, do đó mỗi lớp sẽ dần dần tối hơn. Tán lá cây cung cấp bóng mát như thế này, tuy nhiên nó không được tích lũy. Bạn có cùng một bóng râm dưới gốc cây cho dù đó là 1 hay 100 khối lá.
Một manh mối cho thấy đây là phương pháp đang được sử dụng là nước không bị tối hơn khi xa người xem hơn - chỉ khi bạn đi xuống. Vâng, hiệu ứng sương mù có tác dụng từ xa, nhưng không phải là hiệu ứng bóng tối của nước.
Vì vậy, công thức cơ bản để tính toán ánh sáng sẽ giống như thế này trong mã giả ...
light_on_cube = 1.0
for each cube above target cube, from lowest to highest {
if cube being examined is tree foliage
light_on_cube = 0.5
else if cube being examined is water
light_on_cube = light_on_cube - 0.1
else if cube being examined is solid
light_on_cube = 0
}
Điều này không hoàn hảo để tính toán ánh sáng dưới phần nhô ra hoặc trong hang động, vì nó sẽ tối tối dưới phần nhô ra bằng phương pháp này. Nhưng người ta có thể thêm vào cả hai nguồn sáng cục bộ (đuốc, lửa, v.v.) cũng như coi các khối ánh sáng mặt trời là nguồn sáng. Một cái gì đó như thế này có thể làm điều đó ...
Ý tưởng ở đây là nếu một khối lập phương được thắp sáng bởi mặt trời hoặc một ngọn đuốc, thì khối lập phương bên cạnh nó cũng sẽ được thắp sáng theo một cách nào đó. Và bạn càng ở xa khối ánh sáng đó thì sẽ càng ít ánh sáng. Đó là một cách để ước tính ánh sáng khuếch tán nhưng tôi nghĩ (?) Nó sẽ hoạt động.
Có lẽ tôi đang hiểu nhầm câu hỏi, nhưng tại sao bạn không thể thay đổi màu của các khối tùy thuộc vào độ sâu của chúng?
Nếu bạn có độ sâu d (tính theo khối, bắt đầu từ 0) thì phương trình hợp lý cho độ sáng sẽ là:
L = (1- m ) e - kd + m
Mã số: L = (1.0 - m) * exp(-k * d) + m;
k kiểm soát mức độ tối của nó nhanh hơn (cao hơn = nhanh hơn). Giá trị hợp lý sẽ là 0,5.
m là độ sáng tối thiểu bạn muốn.
L thay đổi từ 0 đến 1.
Nếu bạn không biết cách thay đổi màu của các khối trong bất kỳ API đồ họa nào bạn đang sử dụng thì vui lòng hỏi đó như một câu hỏi riêng biệt (nêu rõ API bạn sử dụng và liệu bạn có sử dụng trình tạo bóng hay không).
e^-kd
bit là chỉ là một phân rã theo cấp số nhân, mà là một chức năng tiêu chuẩn cho điều mà dần dần có xu hướng không qua một số giá trị (chiều sâu). Phép nhân bằng (1-m)
và cộng m
chỉ là để chia tỷ lệ và bù cho sự phân rã sao cho nó kết thúc ở mức tối thiểu m
nhưng vẫn bắt đầu từ 1
. vi.wikipedia.org/wiki/Exponential_decay