MVP (Model, View, Projection)
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 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로 보내주어야 함
🐥 View Transform
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();
- 화각?의 위아래 각도는 FOV(field of view)변수로 지정
- 좌우 각도는 모니터의 비율로 결정
- 실제 렌더링되는 부분은 near plane, far plane 사이의 object들
댓글 남기기