MVP (Model, View, Projection)

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 Constant Buffer

// Constant Buffer in hlsl file (vertex shader)
cbuffer ModelViewProjectionConstantBuffer : register(b0) {
    matrix model;
    matrix view;
    matrix prohection;
}
  • MVP변환의 경우 cpu에서 연산 후 gpu로 보내줌
  • gpu로 넘어가면 버퍼의 내용이 수정될 일이 없기 때문에 constant buffer로 보내줌


🐥 Model Transform

    m_constantBufferData.model =
        Matrix::CreateScale(m_modelScaling) * Matrix::CreateRotationY(m_modelRotation.y) *
        Matrix::CreateRotationX(m_modelRotation.x) * Matrix::CreateRotationZ(m_modelRotation.z) *
        Matrix::CreateTranslation(m_modelTranslation);
    m_constantBufferData.model = m_constantBufferData.model.Transpose();
  • Model Transfrom의 순서는 scale -> rotation -> translation
  • 이때 문제가 하나 있는데 DirectX는 row major, hlsl은 column major라는 것
  • 순서 반대로 연산 후 transpose로 보내주어야 함


ezgif com-crop


🐥 View Transform

1

    m_constantBufferData.view = XMMatrixLookToLH(m_viewEyePos, m_viewEyeDir, m_viewUp);
    m_constantBufferData.view = m_constantBufferData.view.Transpose();
  • View Transform은 lookup matrix를 이용
  • 카메라 위치, 바라보는 방향, 카메라의 normal로 결정


🐥 Projection Transform

    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();

2

  • 화각?의 위아래 각도는 FOV(field of view)변수로 지정
  • 좌우 각도는 모니터의 비율로 결정
  • 실제 렌더링되는 부분은 near plane, far plane 사이의 object들


ezgif com-crop (2)



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기