그리드에서 단위 변환과 관련된 작은 문제에 대한 통찰력을 찾고 있습니다.
업데이트 및 해결
내 문제를 해결했습니다. 자세한 내용은 아래를 참조하십시오. 게시물 의이 부분의 모든 것이 올바른 것으로 판명되었습니다. 어떤 것이라도 다음 사람을위한 미니어처 튜토리얼 / 예제 / 도움말로 작용할 수 있습니다.
설정
- 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 픽셀 대 월드 단위 투영을 제공 할 때 적절한 방식으로 약간 손실되었습니다. 어쨌든, 문제를 해결하기위한 몇 가지 빠른 이미지가 있습니다.
나는 엔진이 64x 오프셋이라고 믿는 것에 많은 스프라이트를 중첩하기로 결정했습니다.
이것이 제자리를 벗어난 것처럼 보였을 때 나는 1 유닛의 기본 사례를 수행했습니다. 예상대로 정렬 된 것 같습니다. 노란색은 움직임에서 1px의 차이를 보여줍니다.
내가 원하는 것
이상적으로 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
내가 시도한 솔루션
-
player.moveRight()
종횡비를 고려하여 1 단위를 방정식에 옮깁니다. 따라서 :gridWidth = 64 / 1.14f
. 그리드 안에 움직임이 맞지 않았습니다. -
직교 투영과 일치하는 512×512 창을 강제 실행했습니다.
-
다양한 마법의 숫자를 시도하고 둘 사이의 상관 관계를 그려 보았습니다.
그 말로, 내가 믿어야 할 것은 내 실제 투영을 녹이는 것입니다. 따라서 1 : 1 픽셀 단위 세계 투영을 유지하는 데 대한 통찰력을 찾고 있습니다.
답변
내 자신의 문제를 해결했습니다. 간단한 설명으로 문제를 해결하기보다는 문제를 디버깅하기 위해 수행 한 단계를 설명하고 싶습니다. 특수 효과를 위해 단일 FBO를 사용하고 있다고 생각했습니다.
첫째, 그것은 위의 모든 것이 실제로 올바른 것으로 판명되었습니다. 내가 한 단계는 문제였습니다.
- 나는 직교 행렬을 통해 확인했습니다.
- 모든 바이트 순서를 확인했습니다.
- 정사각형 텍스처를 만들었습니다. <-여기 마법이있다
- 정사각형 텍스처를 만들 때 화면에서 정사각형이 아니라 정점 셰이더로 들어가는 정사각형을 발견했습니다.
- 이것은 무언가 잘못되었다는 나의 첫 단서였습니다. 화면의 텍스처 크기가 정점 셰이더로가는 크기와 일치하지 않습니다.
- 나는 FBO를 사용하고 있다는 것을 잊었다.
- FBO 텍스처 크기가 어리석은 이유로 뷰포트 텍스처 크기와 일치하지 않았습니다.
- FBO를 비활성화하고 결과가 일치했습니다.
- 텍스처 크기와 wah-lah를 정의하여 로직을 수정했습니다.
시간이 걸린다면 죄송합니다. 나는 그 문제를 알지 못하고 같은 문제를 겪을 수있는 사람에게는 좋은 척도로 남길 것입니다.