그리드에서 직교 단위 변환 불일치 (예 : 64 픽셀이 잘못 변환 됨) 스케일링)에서 그리드 간격은 64×64이며 (64, 64)에서 단위를

그리드에서 단위 변환과 관련된 작은 문제에 대한 통찰력을 찾고 있습니다.

업데이트 및 해결

내 문제를 해결했습니다. 자세한 내용은 아래를 참조하십시오. 게시물 의이 부분의 모든 것이 올바른 것으로 판명되었습니다. 어떤 것이라도 다음 사람을위한 미니어처 튜토리얼 / 예제 / 도움말로 작용할 수 있습니다.

설정

  • FBO, VAO, VBO
  • 512×448 창
  • 64×64 그리드
  • 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 스케일링)에서 그리드 간격은 64×64이며 (64, 64)에서 단위를 그리지 만 단위는 대략 ~ 10px를 잘못된 위치에 그립니다. 픽셀 크기의 왜곡을 방지하기 위해 균일 한 창 크기를 시도했지만 이제는 1 : 1 픽셀 대 월드 단위 투영을 제공 할 때 적절한 방식으로 약간 손실되었습니다. 어쨌든, 문제를 해결하기위한 몇 가지 빠른 이미지가 있습니다.

512x448 창에 64x64 타일

나는 엔진이 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.

프로젝션 매트릭스

512×448 창의 투영 행렬은 다음과 같습니다.

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

세계관 매트릭스

카메라의 위치는 변환 매트릭스 일뿐입니다.이 경우에는 중심에 대해 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. 직교 투영과 일치하는 512×512 창을 강제 실행했습니다.

  3. 다양한 마법의 숫자를 시도하고 둘 사이의 상관 관계를 그려 보았습니다.

그 말로, 내가 믿어야 할 것은 내 실제 투영을 녹이는 것입니다. 따라서 1 : 1 픽셀 단위 세계 투영을 유지하는 데 대한 통찰력을 찾고 있습니다.



답변

내 자신의 문제를 해결했습니다. 간단한 설명으로 문제를 해결하기보다는 문제를 디버깅하기 위해 수행 한 단계를 설명하고 싶습니다. 특수 효과를 위해 단일 FBO를 사용하고 있다고 생각했습니다.

첫째, 그것은 위의 모든 것이 실제로 올바른 것으로 판명되었습니다. 내가 한 단계는 문제였습니다.

  • 나는 직교 행렬을 통해 확인했습니다.
  • 모든 바이트 순서를 확인했습니다.
  • 정사각형 텍스처를 만들었습니다. <-여기 마법이있다
  • 정사각형 텍스처를 만들 때 화면에서 정사각형이 아니라 정점 셰이더로 들어가는 정사각형을 발견했습니다.
  • 이것은 무언가 잘못되었다는 나의 첫 단서였습니다. 화면의 텍스처 크기가 정점 셰이더로가는 크기와 일치하지 않습니다.
  • 나는 FBO를 사용하고 있다는 것을 잊었다.
  • FBO 텍스처 크기가 어리석은 이유로 뷰포트 텍스처 크기와 일치하지 않았습니다.
  • FBO를 비활성화하고 결과가 일치했습니다.
  • 텍스처 크기와 wah-lah를 정의하여 로직을 수정했습니다.

바보

시간이 걸린다면 죄송합니다. 나는 그 문제를 알지 못하고 같은 문제를 겪을 수있는 사람에게는 좋은 척도로 남길 것입니다.


답변