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ởiortho(-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 đề.
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.
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.
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):
Đỉ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ử
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.Buộc một cửa sổ 512x512 với hình chiếu trực giao phù hợp.
Đã 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.