Kích thước sprite tối ưu cho các vòng quay


8

Tôi đang tạo một trò chơi dựa trên sprite và tôi có một loạt các hình ảnh mà tôi có được ở độ phân giải lớn một cách lố bịch và tôi chia tỷ lệ chúng thành kích thước sprite mong muốn (ví dụ 64x64 pixel) trước khi chuyển đổi chúng thành tài nguyên trò chơi, vì vậy khi vẽ sprite trong trò chơi, tôi không phải mở rộng nó.

Tuy nhiên, nếu tôi xoay sprite nhỏ này bên trong trò chơi (động cơ theo kiểu nông nghiệp), một số pixel đích sẽ bị nội suy và sprite sẽ bị nhòe.

Tất nhiên điều này phụ thuộc vào góc quay cũng như thuật toán nội suy, nhưng bất kể, không có đủ dữ liệu để lấy mẫu chính xác một pixel đích cụ thể.

Vì vậy, có hai giải pháp tôi có thể nghĩ ra. Đầu tiên là sử dụng hình ảnh khổng lồ ban đầu, xoay nó theo các góc mong muốn và sau đó thu nhỏ tất cả các biến thể được sắp xếp lại, và đặt chúng vào một tập bản đồ, có ưu điểm là khá đơn giản để thực hiện, nhưng ngây thơ tiêu tốn gấp đôi lượng sprite không gian cho mỗi vòng quay (mỗi vòng quay phải được ghi trong một vòng tròn có đường kính là đường chéo của hình chữ nhật của sprite ban đầu, có diện tích gấp đôi hình chữ nhật ban đầu, giả sử các hình vuông vuông).

Nó cũng có nhược điểm là chỉ có sẵn một bộ xoay được xác định trước, có thể ổn hoặc không tùy thuộc vào trò chơi.

Vì vậy, lựa chọn khác sẽ là lưu trữ một hình ảnh lớn hơn, và xoay và thu nhỏ trong khi kết xuất, dẫn đến câu hỏi của tôi.

Kích thước tối ưu cho sprite này là gì? Ý nghĩa tối ưu rằng một hình ảnh lớn hơn sẽ không có hiệu lực trong hình ảnh kết quả.

Điều này chắc chắn phụ thuộc vào kích thước hình ảnh, số lượng góc quay mong muốn mà không mất dữ liệu xuống 1/256, đây là mức chênh lệch màu tối thiểu có thể biểu thị.

Tôi đang tìm kiếm một câu trả lời chung về mặt lý thuyết cho vấn đề này, bởi vì thử một loạt các kích cỡ có thể ổn, nhưng không phải là tối ưu.


3
Đây không phải là một câu trả lời hữu ích, nhưng tôi đã đọc qua câu hỏi, nói "Ồ, thật dễ!", Đã viết một câu trả lời, cau mày, đọc lại và sau đó suy nghĩ về nó thực sự khó khăn trong vài phút trước khi kết luận rằng trên thực tế, nó không dễ dàng Điều đó nói rằng, bản năng ruột của tôi là "hai lần độ phân giải trên mỗi trục là hoàn hảo hoặc chắc chắn là đủ tốt", nhưng tôi không có bất kỳ bằng chứng nào cho việc này. Cuối cùng, tôi nghi ngờ điều này phụ thuộc đáng kể vào hạt nhân hạ thấp mà bạn đang so sánh - một hạt nhân trung bình pixel đơn giản có thể dễ dàng phân tích và sao chép, nhưng hạt nhân Lanczos có thể chứng minh là không thể.
ZorbaTHut

Tôi nghĩ rằng giả định của bạn rằng 1/256 là giới hạn của delta chênh lệch màu chấp nhận được là sai vì không gian màu truyền thống (sRGB) là phi tuyến tính.
sam hocevar

@sam Nó có thể không tuyến tính khi được tính với phổ ánh sáng thực tế, nhưng lượng tử hóa là tuyến tính. Tuy nhiên, nó thực sự phụ thuộc vào thuật toán nội suy, và kết quả có thể rất khác nhau đối với phép nội suy tuyến tính và nói. Nhưng ngay cả khi không có phép nội suy, vẫn nên có cách tính kích thước tối ưu.
Panda Pyjama

@zorbathut Câu trả lời chắc chắn khác nhau tùy thuộc vào thuật toán downsampling. Nhưng nó tương đối đơn giản để đưa ra một giải pháp chung cho phép nội suy lân cận hoặc tuyến tính gần nhất. Tôi vẫn đang làm việc với nó, nhưng tôi nghĩ rằng trong 8 hướng, sqrt (2) diện tích là tối ưu. Hãy cho tôi biết nơi bạn đã đến
Panda Pajama

Câu trả lời:


7

Tôi nghĩ những gì bạn đang cố gắng làm là không gian hình ảnh 2D tương đương với làm tròn gấp đôi . Tôi có thể xây dựng một bằng chứng lỏng lẻo rằng không thể tìm thấy kích thước trung gian như vậy, ít nhất là trong trường hợp các thuật toán thu nhỏ đơn giản như nội suy tuyến tính.

Giả sử chúng ta thấy Nrằng hình ảnh trung gian có kích thước N×N, lớn hơn 64×64. Giả sử chúng ta thậm chí không áp dụng xoay vòng (góc bằng không).

Bây giờ hãy xây dựng một bức tranh không hoạt động.

Xây dựng hình ảnh trung gian

Xem xét một hình ảnh trung gian hoàn toàn màu đen. Rõ ràng, hình ảnh cuối cùng cũng sẽ có màu đen hoàn toàn. Sau đó, thêm một pixel màu xám có cường độ tối thiểu (RG, B = 1,1,1). Hình ảnh cuối cùng vẫn phải là màu đen hoàn toàn. Thêm một pixel màu xám chạm vào cái đầu tiên. Tiến hành xây dựng một vòng tròn cho đến khi hình ảnh cuối cùng không còn hoàn toàn màu đen.

xây dựng hình ảnh trung gian Hình 1

Bây giờ một pixel trong hình ảnh cuối cùng là màu xám (nếu chúng ta tiếp tục mãi mãi, hình ảnh thu được sẽ hoàn toàn màu xám, vì vậy rõ ràng tại một thời điểm nào đó, một pixel sẽ chuyển sang màu xám) và nếu chúng ta xóa pixel cuối cùng đó, nó sẽ hoàn toàn đen trở lại.

Xây dựng hình ảnh gốc

Hãy xem xét hình ảnh gốc giả thuyết dẫn đến hình ảnh trung gian của chúng tôi. Tôi không thể chứng minh nó tồn tại, nhưng tôi có một cảm giác mạnh mẽ rằng nó có. Chẳng hạn, nếu ảnh gốc có kích thước 2N×2N, thì đây có thể là:

ảnh gốc Hình 2

Khi hạ thấp Ảnh 2 xuống kích thước trung gian, chúng ta sẽ nhận được Ảnh 1.

Và theo giả thuyết, khi hạ thấp xuống 64×64, chúng ta có một chấm màu xám trong hình ảnh cuối cùng.

Bây giờ, hãy tách rời pixel cuối cùng mà chúng ta đã thêm và phân tán nó xung quanh cụm ban đầu:

hình ảnh không làm việcHình 3

Đây là ví dụ phản biện của chúng tôi.

Khi được hạ thấp đến kích thước cuối cùng, hình ảnh này sẽ cung cấp cho chúng ta một pixel màu xám, vì các pixel mà chúng ta phân tán thậm chí còn ở gần cụm hơn, do đó cường độ toàn cầu ít nhất là cao.

Khi hạ thấp kích thước trung gian, hình ảnh này sẽ bỏ lỡ pixel đặc biệt vì chúng bị phân tán xung quanh, vì vậy chúng tôi nhận được hình ảnh hoàn toàn đen khi thực hiện thay đổi kích thước hai bước.

Kết luận và suy nghĩ trong tương lai

Tôi hy vọng điều này thuyết phục bạn rằng những gì bạn đang cố gắng đạt được sẽ không hoạt động trong trường hợp chung.

Cách tiếp cận của tôi đối với vấn đề của bạn sẽ là tính kích thước tốt nhất cho mỗi hình ảnh : bắt đầu với hình ảnh gốc và vd. N = 128, sau đó thử tất cả các góc có thể và tính sai số tối đa. Nếu lỗi tối đa không thỏa mãn, hãy thử N = 256 vv cho đến khi bạn có được kích thước chính xác.


Xem vấn đề này như một cách làm tròn là một cách tiếp cận khá thú vị, nhưng tôi muốn không đồng ý với giả thuyết của bạn rằng điều đó là không thể, vì bạn đang xem xét vấn đề số này, không phải là vấn đề tín hiệu. Hãy xem xét tín hiệu 1 chiều. Bằng cách lấy mẫu tại n điểm, chúng tôi sẽ giữ lại tất cả thông tin với tần số lên tới 1 / 2n . Sử dụng định lý Nyquist, có thể lấy mẫu tín hiệu tại m> n điểm, sau đó lấy mẫu lại tại n điểm và đi đến kết quả giống như khi chúng ta lấy mẫu ban đầu tại n điểm. Điều này có thể dễ dàng mở rộng đến kích thước n.
Panda Pajama

1
@PandaPajama không may bằng cách gọi Nyquist, bạn cho rằng tín hiệu có thể bị giới hạn băng tần một cách nghiêm ngặt, đó không phải là trường hợp khi các mẫu của chúng tôi nằm trên một miền riêng biệt. Đây là những gì ví dụ phản biện của tôi khai thác và tại sao nó liên quan đến làm tròn.
sam hocevar

Nếu hình ảnh gốc lớn tùy ý, nó có thể được coi như thể nó nằm trên một miền liên tục. Tuy nhiên, trên một cuộc thảo luận thực tế hơn, đối số của bạn là hợp lệ khi xem xét một thuật toán rất cụ thể để thu nhỏ với kích thước rất cụ thể (2x). Các phép nội suy lân cận, song tuyến và nhị phân sẽ cho kết quả khác nhau. Cụ thể đối với người hàng xóm gần nhất, tôi tin rằng có thể xây dựng một giải pháp chung về mặt hình học, nhưng điều đó sẽ phải chờ đến cuối tuần.
Panda Pajama

1
@PandaPajama bạn lại đúng, hình ảnh rất lớn có thể được coi là liên tục, nhưng vấn đề là hình ảnh trung gian vẫn nằm trên một miền rời rạc. Ngoài ra, theo định nghĩa, hàng xóm gần nhất sẽ không gặp phải vấn đề làm tròn theo định nghĩa, nhưng ngoài các trường hợp tầm thường, nó sẽ chịu 1) các vấn đề liên quan đến định lý phân phối sẽ làm cho kích thước tối thiểu gần 6400 × 6400, tức là. khá không thực tế, và 2) các vấn đề răng cưa nghiêm trọng.
sam hocevar
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.