본문 바로가기

DX

모델 뷰 프로젝션 (MVP) 과 프로젝션 행렬

vsshader 를 보면 mvp 를 어떻게 사용하는지 확인 할 수 있다.

cbuffer 는 const 버퍼를 의미하고 cpu 가 gpu 로 보낸 데이터의 형식을 그대로 가지고 있다.

 

shader 의 input 은 D3D11_INPUT_ELEMENT_DESC 으로 설정해뒀던 세그멘틱스 형식인 pos 와 color 를 이용한다.

 

main 을 주요 실행 함수로 설정하고 컬러 값을 설정한다.

 

업데이트 시에 모델 뷰 프로젝션 행렬을 설정해서 const 버퍼로 보내준다. ( c++ )

 

Transpose 하는 이유 : Row 메이저를 Column 으로 바꿔야하기 때문에

 

 

View 행렬은 Model 행렬을 만드는 것과 성질이 비슷하다.

 

 

프로젝션

원근 투영에서 시야각을 설정하고 aspect 종횡비를 설정한다. nearz 나 farz 로 가깝고 먼 물체의 렌더링 유무를 설정 가능하다.

    // 프로젝션
    // m_aspect = AppBase::GetAspectRatio(); // <- GUI에서 조절
    if (m_usePerspectiveProjection) {
        m_constantBufferData.projection = XMMatrixPerspectiveFovLH(
            XMConvertToRadians(m_projFovAngleY), m_aspect, m_nearZ, m_farZ);
    } else {
        m_constantBufferData.projection =
            XMMatrixOrthographicOffCenterLH(-m_aspect, m_aspect, -1.0f, 1.0f, m_nearZ, m_farZ);
    }
    m_constantBufferData.projection = m_constantBufferData.projection.Transpose();

    // Constant를 CPU에서 GPU로 복사
    AppBase::UpdateBuffer(m_constantBufferData, m_constantBuffer);

 

nearz 를 설정하여 가까운 면을 그리지 않는 예시

 

 

Perspective Projection

그림의 n ~ f 사이에 오브젝트만 렌더링한다.

프로젝션 윈도우에 그림을 표현할려면 거리 d 를 알아야한다.

 

위에서 바라봤을 때 는 aspect 인 r 이 곱해져 있어야한다.

 

프로젝션 행렬

마지막 요소의 값을 1로 만들기 위해 z 값을 나눠주는 것을 호모지니어스 디바이드라고 한다.

 

프로젝션 행렬을 곱한 후에는 z 값으로 나누고 다시 r 로 나누어져 있다.

r 이 1 보다 큰 것을 대비해 ndc 좌표에 맞춰주기 위해 r 로 나누어 주는 것이다.

항상 프로젝션이 끝난 후에는 좌표의 범위가 ndc 에 맞춰 정의 되어 있어야한다.

 

다만 z 같은 경우에는 Depth Value 에 맞춰야하고 보통 0 ~ 1 사이가 된다. 

z 값에 z 값이 f 와 같으면 1이 되기 때문에 벗어나면 far 값을 넘어가 렌더링 안되어진다. 

 

View Frustum 을 벗어나는 폴리곤을 클리핑한다. 만약 잘랐을때 3각형 보다 꼭짓점이 많으면 더욱 세밀하게 잘라내어 폴리곤으로 만든다. 이러한 과정은 파이프라인 내에서 자동으로 적용되어 진다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'DX' 카테고리의 다른 글

HLSL 기본 문법  (0) 2025.06.15
HLSL 개요  (0) 2025.06.15
D3D11 렌더링 파이프라인  (0) 2025.06.15
D3D11 초기화  (0) 2025.06.15
COM 과 D3D  (0) 2025.06.15