2009-07-03 17 views
5

Tôi đang nghĩ đến việc nhòe chuyển động mờ vào chương trình 2D của mình, nhưng tôi nghi ngờ kết quả của thuật toán hiện tại của mình.Giải pháp làm mờ chuyển động 2D

Tiếp cận của tôi trông như thế này vào lúc này:

  • Draw để backbuffer.
  • Khi thời gian để cập nhật bộ đệm trước, hãy trộn bộ đệm trước vào bộ đệm trước.
  • Lặp lại

Điều gì sẽ gây ra "motion blur" hiệu ứng rõ ràng là sự pha trộn, như các đối tượng chuyển động sẽ để lại một dấu vết mờ dần.

Điều này rõ ràng là không đòi hỏi nhiều về phần cứng, việc đệm đôi sẽ được thực hiện và bước bổ sung duy nhất là pha trộn alpha, đây là một phép tính đơn giản. Tuy nhiên, những con đường mòn sẽ rất sắc nét, và không bị mờ chút nào có thể trông hơi lạ. Tôi có thể làm một hộp mờ trên bộ đệm phía sau trước khi bước pha trộn, nhưng nó cảm thấy như nó có thể rất thuế trên các hệ thống cấp thấp như Nintendo DS.

Có giải pháp nào cho phép tôi làm điều đó hiệu quả hơn hoặc mang lại kết quả tốt hơn không?

Trả lời

5

Thực sự bạn nên hiển thị nhiều khung hình trung gian và trộn chúng thành một kết quả. Ví dụ, giả sử tốc độ khung hình đầu ra của bạn là 50 fps. Có thể bạn sẽ nhận được kết quả hợp lý nếu bạn hiển thị nội bộ ở tốc độ 500 khung hình/giây và nhóm mười khung hình kết hợp lại với nhau trước khi hiển thị cho người dùng.

Cách tiếp cận bạn đang sử dụng tại thời điểm này mô phỏng sự kiên trì, như thể bạn đang hiển thị trên một CRT cũ với phosphor chậm. Điều này không thực sự giống như chuyển động mờ. Nếu thời lượng khung của bạn là 20ms (1000/50) thì khung mờ chuyển động bao gồm các kết xuất trải dài trong khoảng thời gian 20ms, tất cả đều có cùng trọng số alpha. Các giải pháp kiên trì bao gồm render từ 20, 40, 60, 80, 100ms trước, dần dần mờ dần.

+0

Đây là một gợi ý tốt, tuy nhiên có vẻ như nó có thể mất rất nhiều sức mạnh xử lý. – Skurmedel

+1

Thật vậy. Tùy thuộc vào loại nguyên thủy bạn đang hiển thị, có thể một số tối ưu hóa bạn có thể áp dụng. Hoặc bạn có thể thử một lai của đề nghị của tôi và của bạn. Thuật toán bạn đề xuất là một mẹo viết mã demo tiêu chuẩn vào thập niên 90. Nó có thể tạo ra kết quả tốt đẹp. Tuy nhiên, nếu bạn đang tìm kiếm một mục đích chung, đơn giản, nhanh chóng thực hiện chuyển động mờ, bạn đã hết may mắn. Đó là lý do tại sao bạn hầu như không bao giờ nhìn thấy nó thực hiện. –

1

Nó có thể không sắc nét chút nào. Tất cả phụ thuộc vào chức năng pha trộn được sử dụng. Ví dụ 0.1/0.9 cho hình ảnh trước đó/hiện tại tương ứng sẽ cung cấp một số đường mòn mờ nhạt.

Tôi có thể thêm rằng đây thực chất là như thế nào chuyển động mờ trong OpenGL được thực hiện (thông qua bộ đệm tích lũy)

+0

Cảm ơn bạn đã nhập. Tốt để biết rằng ý tưởng của tôi đã không quá nghiệp dư :) – Skurmedel

1

Không có cách nào thực sự để làm điều đó một cách hiệu quả hơn để hiểu biết của tôi. Thats về hiệu quả như nó được. Có vẻ khá tốt nếu tốc độ khung hình tốt và chuyển động không quá sắc nét.

Kế hoạch tìm kiếm tốt nhất sẽ là, đối với mỗi pixel, vẽ đường nửa trong suốt từ vị trí mới đến vị trí cũ. Đây không phải là một tính toán tầm thường, tuy nhiên.

+0

Tôi nên thêm rằng ngay cả kế hoạch này trông tốt hơn sẽ nhìn sai nếu giữa các khung hình đối tượng đã không di chuyển tuyến tính. – Goz

+0

Cảm ơn. Đó là một suy nghĩ thú vị Goz, hadnät đã xem xét điều đó. Nó có thể trông kỳ lạ nếu một đối tượng đi từ một đầu đến màn hình khác trong một khung hình duy nhất nếu opacity của backbuffer thấp. – Skurmedel