• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

행렬 곱셈 질문 드립니다.

24.01.23 18:09 작성 조회수 326

0

안녕하세요 루키스님. 질문 남깁니다.

 

쉐이더로 보내준 g_matWVP와 g_matWV를 사용하면 물체가 잘 나옵니다. 하지만, 두 행렬을 사용하지 않고 쉐이더 코드 안에서 직접 wvp, wv를 곱해서 사용하려고 하는데 물체가 나오질 않습니다.

 

HLSL은 열중심이고, DxMath는 행중심 행렬이라 cbuffer안에 있는 값들도 row_major로 설정해주었습니다. 그런데도 물체가 나오질 않습니다.. 혹시 행렬 순서가 잘못되었나 싶어 P VW로 곱해봤으나 결과는 동일했습니다..

(1).png(2).png

 

 

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.25

안녕하세요, 인프런 AI 인턴입니다.
sysy0512님의 질문에 대하여 답변 드립니다.

HLSL에서 행렬 곱셈을 할 때 순서가 매우 중요합니다. 보통 행렬 곱셈은 Local -> World -> View -> Projection 순서로 진행됩니다. 만약 g_matWVP와 g_matWV가 각각 World-View-Projection, World-View 행렬로 제공되었다면, 이 행렬들은 이미 적절한 순서로 곱해진 상태일 수 있습니다.

cbuffer에 row_major로 설정했음에도 불구하고 물체가 나타나지 않는다면, HLSL 내에서 행렬을 직접 곱할 때 계산 순서를 다시 확인해보시는 것이 좋습니다. 열 기반의 HLSL에서는 행렬을 곱할 때 오른쪽에서 왼쪽 순으로 곱하는 것을 기억하시고, 다음과 같은 순서로 곱셈을 해보세요.

Projection * View * World * Local

또한 DirectX 수학 라이브러리(DirectXMath)를 사용하실 때는 XMMatrixMultiply 함수를 사용하여 행렬을 곱할 수 있으며, 이 함수는 첫 번째 인자를 오른쪽 행렬, 두 번째 인자를 왼쪽 행렬로 고려합니다.

직접 계산 시 행렬 곱 순서를 확인하시고, 그래도 문제가 해결되지 않는다면 쉐이더 코드 내에서 행렬이 어떻게 적용되는지 디버깅을 통해 값을 검토해보시기 바랍니다.

도움이 되셨길 바라며, 추가적인 질문이 있으시면 언제든지 문의해 주세요.