หน่วยการแปลหน่วย Orthographic ไม่ตรงกันในตาราง (เช่น 64 พิกเซลแปลไม่ถูกต้อง)


14

ฉันกำลังมองหาข้อมูลเชิงลึกเกี่ยวกับปัญหาเล็ก ๆ ด้วยการแปลหน่วยบนกริด

อัปเดตและแก้ไข

ฉันแก้ไขปัญหาของฉันเอง ดูรายละเอียดด้านล่าง ทุกอย่างในส่วนนี้ของโพสต์กลายเป็นถูกต้อง หากสิ่งใดมันสามารถทำหน้าที่เป็นแบบฝึกหัด / ตัวอย่าง / ช่วยเหลือขนาดเล็กสำหรับบุคคลต่อไป

ติดตั้ง

  • FBO, VAO, VBO
  • หน้าต่าง 512x448
  • ตาราง 64x64
  • gl_Position = projection * world * position;
  • projectionถูกกำหนดโดยortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);นี่คือฟังก์ชั่นการฉายภาพแบบตั้งฉากกับตำรา
  • world ถูกกำหนดโดยตำแหน่งกล้องคงที่ที่ (0, 0)
  • position ถูกกำหนดโดยตำแหน่งของสไปรต์

ปัญหา

ในภาพหน้าจอด้านล่าง (มาตราส่วน 1: 1) ระยะห่างของกริดคือ 64x64 และฉันกำลังวาดหน่วยที่ (64, 64) อย่างไรก็ตามหน่วยวาดประมาณ ~ 10px ในตำแหน่งที่ไม่ถูกต้อง ฉันได้ลองใช้ขนาดหน้าต่างที่เท่ากันเพื่อป้องกันการบิดเบี้ยวของขนาดพิกเซล แต่ตอนนี้ฉันหลงทางเล็กน้อยในวิธีการที่เหมาะสมในการให้การฉายภาพแบบพิกเซลต่อโลก 1: 1 ยังไงก็ตามนี่คือรูปภาพบางส่วนที่จะช่วยคุณได้

64x64 ไทล์บนหน้าต่าง 512x448

ฉันตัดสินใจใส่สไปรต์จำนวนมากในสิ่งที่เครื่องยนต์เชื่อว่าเป็นออฟเซ็ต 64x

64 ออฟเซ็ตที่กำหนดสุด ๆ

เมื่อสิ่งนี้ดูเหมือนจะเกิดขึ้นฉันไปเกี่ยวกับและทำกรณีฐานของ 1 หน่วย ซึ่งดูเหมือนจะเข้าแถวตามที่คาดไว้ สีเหลืองแสดงความแตกต่าง 1px ในการเคลื่อนไหว

กรณีฐานของ 1 หน่วย

สิ่งที่ฉันต้องการ

การเคลื่อนที่ในทิศทางใดก็ได้หน่วยที่ 64 จะแสดงผลลัพธ์ต่อไปนี้

ผลลัพธ์ที่ต้องการ

จุด

ดูเหมือนว่าจุดยอดที่ไปสู่จุดยอดถูกต้อง ตัวอย่างเช่นในการอ้างอิงถึงภาพแรกข้อมูลจะมีลักษณะเช่นนี้ใน 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

เพื่อความสมบูรณ์นี่คืออาร์เรย์จริงที่สอดคล้องกับการเคลื่อนไหวด้านบน:

      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.

ฉายเมทริกซ์

เมทริกซ์การฉายสำหรับหน้าต่าง 512x448 มีลักษณะดังนี้:

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

และถูกสร้างขึ้นด้วยฟังก์ชั่นการฉายภาพมุมฉากตำรา:

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;
}

เมทริกซ์มุมมองโลก

ตำแหน่งของกล้องเป็นเพียงเมทริกซ์การแปลซึ่งในกรณีนี้ฉันเพิ่งชดเชยด้วย -w / 2 และ -h / 2 ให้เป็นศูนย์เมื่อเทียบกับศูนย์

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

แนวทางแก้ไขที่ฉันได้ลอง

  1. player.moveRight()จะย้าย 1 หน่วยด้วยอัตราส่วนกว้างยาวที่รวมอยู่ในสมการ ดังนั้น: gridWidth = 64 / 1.14f. การเคลื่อนไหวไม่พอดีกับตาราง

  2. บังคับให้หน้าต่างขนาด 512x512 ที่มีการฉายภาพฉากฉากที่ตรงกัน

  3. พยายามใช้เวทมนตร์ตัวเลขต่าง ๆ และพยายามวาดความสัมพันธ์ระหว่างทั้งสอง

จากที่กล่าวมาทั้งหมดที่ฉันเชื่อว่าเหลืออยู่ก็คือฉันทำตัวประมาณการตามจริง ดังนั้นฉันกำลังมองหาข้อมูลเชิงลึกเกี่ยวกับการรักษาการประมาณการ 1: 1 พิกเซลต่อโลก


5
คำถามที่ถูกสร้างขึ้นมาอย่างดี แต่บางทีเราอาจเห็นเมทริกซ์การฉายและโลกของคุณ คุณพูดถึงข้างต้น แต่ไม่ได้รวมเนื้อหาของพวกเขา ปัญหาจะเกิดขึ้นกับเมทริกซ์ตัวใดตัวหนึ่ง
เคน

@ เคนไม่มีปัญหาเลย ฉันได้เพิ่มการฉายภาพและเมทริกซ์มุมมองโลก - อวกาศ ฉันได้รวมเอาท์พุทที่ฉันต้องการและความพยายามของฉันเองที่ปัญหา
Justin Van Horne

เมทริกซ์คุณดูดี (ฉันเปรียบเทียบพวกมันที่ผลิตโดย glOrtho และ glTranslate การขุดที่หลอดที่นี่ แต่ opengl คาดว่าเมทริกซ์จะจัดเรียงตามคอลัมน์ที่สำคัญคุณทำแบบเดียวกันหรือเปล่า
Ken

หืมมพวกเขากำลังถูกเก็บไว้ในลำดับหลักของคอลัมน์
Justin Van Horne

คำตอบ:


5

ฉันแก้ไขปัญหาของตัวเอง - และแทนที่จะอธิบายให้ง่ายกว่านี้ฉันต้องการอธิบายขั้นตอนที่ฉันใช้เพื่อแก้ไขข้อบกพร่อง ฉันออกไปว่าฉันกำลังใช้ FBO เดียวสำหรับเทคนิคพิเศษ

ก่อนอื่นปรากฎว่าทุกอย่างที่กล่าวมาข้างต้นนั้นถูกต้องจริงและขั้นตอนที่ฉันทิ้งไว้คือปัญหา

  • ฉันตรวจสอบการฝึกอบรมฉากของฉันผ่านและผ่าน
  • ตรวจสอบลำดับไบต์ของทุกสิ่ง
  • สร้างพื้นผิวสี่เหลี่ยมจัตุรัส <- นี่คือเวทย์มนตร์
  • เมื่อฉันสร้างพื้นผิวรูปสี่เหลี่ยมจัตุรัสฉันสังเกตว่ามันไม่ใช่รูปสี่เหลี่ยมบนหน้าจอ
  • นี่เป็นเงื่อนงำแรกของฉันว่ามีบางอย่างผิดปกติ ขนาดของพื้นผิวของฉันบนหน้าจอไม่ตรงกับขนาดที่ไปที่จุดยอด
  • ฉันลืมว่าฉันกำลังใช้ FBO (นี่คือความโง่เขลา)
  • ขนาดพื้นผิว FBO ไม่ตรงกับขนาดพื้นผิววิวพอร์ตของฉันไม่ว่าด้วยเหตุผลใดก็ตาม
  • ปิดการใช้งาน FBO และผลลัพธ์ที่ตรงกัน
  • แก้ไขตรรกะด้วยการกำหนดขนาดพื้นผิวและวา - ลาห์

Sillyness

ฉันขอโทษถ้าสิ่งนี้ใช้เวลาของทุกคน ฉันจะทิ้งคำถามไว้รอบ ๆ ว่าเป็นมาตรการที่ดีสำหรับทุกคนที่อาจพบปัญหาเดียวกันโดยไม่รู้ตัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.