Bản dịch đơn vị chính tả không khớp trên lưới (ví dụ 64 pixel dịch không chính xác)


14

Tôi đang tìm kiếm một cái nhìn sâu sắc về một vấn đề nhỏ với các bản dịch đơn vị trên lưới.

Cập nhật và giải quyết

Tôi đã giải quyết vấn đề của riêng tôi. Xem bên dưới để biết chi tiết. Tất cả mọi thứ trong phần này của bài viết hóa ra là chính xác. Nếu bất cứ điều gì nó có thể hoạt động như một hướng dẫn / ví dụ / trợ giúp thu nhỏ cho người tiếp theo.

Thiết lập

  • FBO, VAO, VBO
  • Cửa sổ 512x448
  • Lưới 64x64
  • gl_Position = projection * world * position;
  • projectionđược định nghĩa bởi ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);Đây là một hàm chiếu trực giao sách giáo khoa.
  • world được xác định bởi vị trí camera cố định tại (0, 0)
  • position được xác định bởi vị trí của sprite.

Vấn đề

Trong ảnh chụp màn hình bên dưới (tỷ lệ 1: 1), khoảng cách lưới là 64x64 và tôi đang vẽ đơn vị ở (64, 64), tuy nhiên, đơn vị vẽ khoảng ~ 10px ở vị trí sai. Tôi đã thử kích thước cửa sổ thống nhất để ngăn chặn bất kỳ biến dạng nào về kích thước pixel, nhưng bây giờ tôi hơi lạc lõng trong cách cung cấp phép chiếu đơn vị pixel theo tỷ lệ 1: 1 cho thế giới. Dù sao, đây là một số hình ảnh nhanh chóng để hỗ trợ trong vấn đề.

Gạch 64x64 trên cửa sổ 512x448

Tôi quyết định siêu áp đặt một loạt các sprite với những gì động cơ tin là độ lệch 64x.

64 bù đắp siêu áp đặt

Khi điều này có vẻ không đúng chỗ, tôi đã đi và làm trường hợp cơ bản của 1 đơn vị. Mà dường như xếp hàng như mong đợi. Màu vàng cho thấy sự khác biệt 1px trong chuyển động.

Trường hợp cơ sở của 1 đơn vị

Những gì tôi muốn

Di chuyển lý tưởng theo bất kỳ hướng nào 64 đơn vị sẽ tạo ra các đơn vị sau (đơn vị siêu áp đặt):

Sản phẩm chất lượng

Đỉnh

Có vẻ như các đỉnh đi vào shader đỉnh là chính xác. Ví dụ: liên quan đến hình ảnh đầu tiên, dữ liệu trông như thế này trong VBO:

      x    y           x    y
    ----------------------------    
tl | 0.0  24.0        64.0 24.0
bl | 0.0  0.0    ->   64.0 0.0
tr | 16.0 0.0         80.0 0.0
br | 16.0 24.0        80.0 24.0

Để hoàn thiện ở đây là mảng thực tế tương ứng với các chuyển động trên:

      x     y    z   w   r   g   b   a      s          t
-------------------------------------------------------------
tl | 0.0   23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.62650603 
bl | 0.0   0.0  0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.76506025 
tr | 16.0  0.0  0.0 1.0 0.0 0.0 0.0 1.0 0.2263158  0.76506025 
br | 16.0  23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158  0.62650603 
-------------------------------------------------------------
-------------------------------------------------------------
tl | 64.0  24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0        0.21084337 
bl | 64.0  0.0  0.0 1.0 0.0 0.0 0.0 1.0 0.0        0.3554217 
tr | 80.0  0.0  0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.3554217 
br | 80.0  24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.21084337

// side bar: I know that I have unnecessary data with having a z-axis.
//           The engine flips between perspective and orthogonal and I
//           haven't selectively started pruning data.

Ma trận chiếu

Ma trận chiếu cho cửa sổ 512x448 trông như thế này:

0.00390625 0.0         0.0  0.0
0.0        0.004464286 0.0  0.0
0.0        0.0        -1.0  0.0
0.0        0.0         0.0  1.0

và được xây dựng với chức năng chiếu trực giao sách giáo khoa:

ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
// explicitly: ortho(-512/2.0f, 512/2.0f, -448/2.0f, 448.0f

ortho(float left, float right, float bottom, float top)
{
    projection.setIdentity();
    projection.m00 = 2.0f / (right - left);
    projection.m11 = 2.0f / (top - bottom);
    projection.m22 = -1;
    projection.m30 = -(right + left) / (right - left);
    projection.m31 = -(top + bottom) / (top - bottom);
    projection.m32 = 0;
}

Ma trận thế giới

Vị trí của máy ảnh chỉ là một ma trận dịch mà trong trường hợp này tôi chỉ cần bù -w / 2 và -h / 2 bằng 0 so với trung tâm.

1.0 0.0 0.0 -256.0
0.0 1.0 0.0 -224.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0

Giải pháp tôi đã thử

  1. player.moveRight()sẽ di chuyển 1 đơn vị với tỷ lệ khung hình được tính vào phương trình. Vì vậy : gridWidth = 64 / 1.14f. Phong trào không phù hợp trong lưới điện.

  2. Buộc một cửa sổ 512x512 với hình chiếu trực giao phù hợp.

  3. Đã thử nhiều con số ma thuật khác nhau và cố gắng rút ra mối tương quan giữa hai người.

Như đã nói, tất cả những gì tôi còn lại để tin là tôi đang thực hiện dự đoán thực tế của mình. Vì vậy, tôi đang tìm kiếm bất kỳ cái nhìn sâu sắc nào trong việc duy trì phép chiếu đơn vị pixel theo tỷ lệ 1: 1.


5
Câu hỏi được xây dựng tốt, nhưng có lẽ chúng ta có thể thấy ma trận chiếu & ma trận thế giới của bạn. Bạn đã đề cập đến chúng ở trên, nhưng không bao gồm nội dung của chúng. Vấn đề sẽ là với một trong những ma trận đó.
Ken

@Ken Không có vấn đề gì cả. Tôi đã thêm ma trận chiếu và không gian thế giới quan của mình. Tôi cũng đã bao gồm đầu ra mong muốn của mình và các nỗ lực của riêng tôi vào vấn đề.
Justin Van Horne

Các ma trận của bạn trông rất tốt (tôi đã so sánh chúng với các ma trận được tạo ra bởi glOrtho và glTranslate. Grapsing tại ống hút ở đây, nhưng opengl hy vọng ma trận của nó được sắp xếp theo thứ tự chính, bạn có làm như vậy không?
Ken

Hừm, họ đang được lưu trữ theo thứ tự chính cột.
Justin Van Horne

Câu trả lời:


5

Tôi đã giải quyết vấn đề của riêng mình - và thay vì chỉ giải thích nó như một lời giải thích đơn giản, tôi muốn mô tả các bước tôi đã thực hiện để gỡ lỗi vấn đề. Tôi đã bỏ qua rằng tôi đang sử dụng một FBO duy nhất cho các hiệu ứng đặc biệt.

Đầu tiên, hóa ra mọi thứ ở trên thực tế đều đúng và một bước tôi bỏ qua là vấn đề.

  • Tôi đã xác minh các ma trận trực giao của mình xuyên suốt.
  • Xác nhận thứ tự byte của mọi thứ.
  • Tạo một kết cấu vuông. <- Đây là phép màu
  • Khi tôi tạo một kết cấu hình vuông, tôi nhận thấy nó không phải là hình vuông trên màn hình, mà là hình vuông đi vào bộ đổ bóng đỉnh.
  • Đây là manh mối đầu tiên của tôi rằng có gì đó không ổn. Kích thước của họa tiết của tôi trên màn hình không khớp với kích thước của trình đổ bóng đỉnh.
  • Tôi quên rằng tôi đang sử dụng một FBO (ở đây có sự ngớ ngẩn).
  • Kích thước kết cấu FBO không khớp với kích thước kết cấu khung nhìn của tôi vì bất kỳ lý do ngu ngốc nào.
  • Vô hiệu hóa FBO và kết quả phù hợp.
  • Đã sửa lỗi logic bằng cách xác định kích thước kết cấu của tôi và wah-lah.

Sự ngớ ngẩn

Tôi xin lỗi nếu điều này chiếm hết thời gian của bất cứ ai. Tôi sẽ để lại câu hỏi xung quanh như một biện pháp tốt cho bất kỳ ai có thể gặp phải vấn đề tương tự mà không biết.

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.