여러 개의 정점 좌표를 CPU의 클립/투영 공간으로 변환해야하는 코드를 작성했습니다 (기존 응용 프로그램과 통합하기 위해 셰이더는 여기 응용 프로그램으로 사용할 수 없습니다). 나중에 자체 쉐이더를 제공합니다.) 결과는 X 축을 중심으로 회전하는 카메라를 내려다 보는 기본적인 '카메라 스타일'변환 + 투영이 될 테스트 케이스가 있습니다. 다음투영 행렬 변환 'around wrapping'
테스트 케이스는 다음
#include <windows.h>
#include <xnamath.h>
#include <stdio.h>
int main()
{
XMVECTOR atPos = XMVectorSet(925.0f, -511.0f, 0.0f, 0.0f);
XMVECTOR eyePos = XMVectorSet(925.0f, -311.0f, 200.0f, 0.0f);
XMVECTOR upDir = XMVectorSet(0.f, 0.f, 1.f, 0.0f);
XMMATRIX viewMatrix = XMMatrixLookAtLH(eyePos, atPos, upDir);
XMMATRIX projectionMatrix = XMMatrixPerspectiveFovLH(XMConvertToRadians(55.f), 1.0f, 0.1f, 5000.0f);
XMMATRIX viewProjMatrix = viewMatrix * projectionMatrix;
XMVECTOR coord1 = XMVectorSet(925.0f, -500.0f, 0.0f, 0.0f);
XMVECTOR coord2 = XMVectorSet(925.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR coord3 = XMVectorSet(925.0f, -1000.0f, 0.0f, 0.0f);
coord1 = XMVector3TransformCoord(coord1, viewProjMatrix);
coord2 = XMVector3TransformCoord(coord2, viewProjMatrix);
coord3 = XMVector3TransformCoord(coord3, viewProjMatrix);
printf(" 0: %g %g %g\n", XMVectorGetX(coord2), XMVectorGetY(coord2), XMVectorGetZ(coord2));
printf(" -500: %g %g %g\n", XMVectorGetX(coord1), XMVectorGetY(coord1), XMVectorGetZ(coord1));
printf("-1000: %g %g %g\n", XMVectorGetX(coord3), XMVectorGetY(coord3), XMVectorGetZ(coord3));
getc(stdin);
}
I 단지 뷰 매트릭스 변환하면 I 정확하게 좌표 입력 Y 값과 상관 이동하는 Y 값에 주목하고있어; 그러나 투영 행렬을 추가하면 Y 값은 투영 공간에서 뷰의 '북쪽'에있는 좌표와 뷰의 '남쪽'에있는 좌표가 같은 방향으로 확장되어 감싸는 것처럼 보입니다. 최종 응용 프로그램에서 유사한 코드를 사용하여 변형 된 최종면이 올바른 순서로 그리는 대신 서로 중첩됩니다.
이 점에있어서 내가 뭘 잘못하고 있으며, 적어도이 입력에 대해 올바른 결과를 얻을 수 있습니까? 즉, 입력 Y가 앞으로 나아갈 때와 같은 방식으로 확장 할 수 있습니까? 범위, 나는 의심해야한다) 문제?
XMVECTOR 상수를 작성하는 효율적인 방법은 "XMVECTORF32"유형을 사용하는 것입니다. 예를 들어''static const XMVECTORF32 atPos = {925.0f, -511.0f, 0.0f, 0.0f};''XMVectorSet''의 사용은 실제로 변수를위한 것이지 상수 값을위한 것이 아닙니다. –
전체 벡터를 인쇄하는 효율적인 방법은 다음과 같습니다 :''XMFLOAT4A tmp; XMStoreFloat4 (& tmp, coord2); printf ("0 : % g % g % g \ n", tmp.x, tmp.y, tmp.z); " –