OpenGL 2D Rasterization Sub-Pixel Dịch


7

Tôi có một công cụ 2D dựa trên gạch trong đó ma trận chiếu là một khung nhìn chính tả về thế giới mà không áp dụng bất kỳ tỷ lệ nào. Do đó: một pixel pixel được vẽ trên màn hình với cùng kích thước.

Tất cả đều hoạt động tốt và trông đẹp mắt nhưng nếu máy ảnh tạo ra một chuyển động pixel phụ thì các đường nhỏ xuất hiện giữa các ô. Tôi có thể cho bạn biết trước những gì không khắc phục vấn đề:

  • GL_NEAREST nội suy kết cấu
  • GL_CLAMP_TO_EDGE

Vấn đề gì đã khắc phục được vấn đề của vấn đề là neo máy ảnh vào pixel gần nhất thay vì thực hiện dịch pixel phụ. Tôi có thể sống với điều đó, nhưng chuyển động của máy ảnh trở nên giật. Bất kỳ ý tưởng làm thế nào để khắc phục vấn đề đó mà không cần dùng đến thủ thuật làm tròn tôi hiện đang làm?


Bạn có bất kỳ cơ hội lưu trữ nhiều kết cấu gạch trong một kết cấu lớn? Tôi nhớ có một vấn đề tương tự, và đó là do các pixel hiển thị OpenGL từ kết cấu ô liền kề. Làm thế nào tôi giải quyết nó cuối cùng là di chuyển từng ô đến kết cấu của riêng họ. Đã được một thời gian, tôi không chắc vấn đề xảy ra với GL_NEAREST, hay chỉ với GL_LINEAR.
reko_t

Tôi làm, nhưng không có giải pháp đề xuất nào cho vấn đề cụ thể này (GL_NEAREST) ​​giúp đỡ một chút. Ngoài ra, các lỗi làm tròn cho kết cấu có nghĩa là tôi nhìn thấy các pixel lân cận nhưng những gì tôi thấy là nền tảng của sprite dẫn đến ý tưởng rằng đây có thể là một vấn đề rasterization chung.
Armin Ronacher

Câu trả lời:


1

Để tránh hiện tượng giật máy ảnh, bạn nên giữ máy ảnh tọa độ điểm nổi, nhưng kẹp hình chiếu OpenGL vào pixel gần nhất.


Làm thế nào mà làm việc? Ma trận chiếu chỉ được thiết lập một lần như một dự án chính tả, không có thay đổi nào trong các khung được áp dụng cho nó.
Armin Ronacher

À xin lỗi, tôi nhận ra tôi không rõ ràng chút nào. Tôi muốn nói rằng bạn nên cố gắng điều chỉnh các ma trận xem và chiếu để chúng được kẹp vào pixel gần nhất, nhưng không lưu các giá trị được kẹp này vào các tham số của máy ảnh, nếu không bạn sẽ tích lũy lỗi và gây ra hiện tượng jitter. Nếu đây đã là những gì bạn đang làm và máy ảnh vẫn bị giật, thì chúng ta sẽ cần biết thêm về đồ họa của bạn: đó là nghệ thuật pixel hay các bản vẽ bóng mờ? Mô hình của bạn lớn cỡ nào?
sam hocevar

Đó là một nền tảng 2d. Bây giờ tôi đang kẹp kết xuất đồ họa vào pixel hoạt động tốt. Nếu tôi chụp ảnh cuối cùng và sử dụng photoshop để di chuyển ảnh bất kỳ lượng pixel phụ nào lên trên cùng, tôi sẽ có được chính xác những gì tôi muốn -> chuyển động mượt mà. Tôi có thể làm điều đó trong OGL nếu kết xuất thành FB và sau đó dịch nó. Nếu tôi làm điều đó với ma trận modelview, khoảng cách giữa các ô sẽ xuất hiện.
Armin Ronacher

Bạn cũng đang làm tròn tọa độ đối tượng thế giới của mình trước khi gửi chúng đến OGL chứ? Tôi làm chính xác điều đó cho một trò chơi isometric và nó hoạt động tốt.
sam hocevar

0

Bạn có thể thấy bài đăng trên blog này về việc sử dụng doublethay vì floatcho ma trận OpenGL. Tôi đã gặp vấn đề tương tự trên PC khi sử dụng OpenGL, vì vậy nó không dành riêng cho iPhone / OpenGL ES, mặc dù bài đăng trên blog có đề cập đến OpenGL ES trên iPhone.


Người bỏ phiếu ít nhất có thể giải thích việc bỏ phiếu của mình không? Câu trả lời của tôi là thông tin và đề xuất một giải pháp cho vấn đề của OP.
jv42

0

Có thể là khi tính toán tọa độ của các góc của mỗi ô, bạn sẽ mất một số độ chính xác. Vì vậy, ví dụ, bạn nghĩ rằng đỉnh dưới cùng bên phải của ô 0 nằm ở cùng một vị trí với đỉnh dưới cùng bên trái của ô 1, nhưng thực tế không phải vậy. Một ý tưởng để khắc phục nó là tính toán một lưới tọa độ tạm thời ở đầu, sau đó sao chép vị trí thích hợp khi xây dựng hình dạng gạch. Điều đó có ý nghĩa?

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.