[Unity] 행렬과 MVP 변환

2023. 6. 12. 19:14Unity

728x90
반응형

크기를 제어하는 행렬

크기를 제어하는 행렬은 위와 같은 형식으로 나타낼 수 있다. 1이 포함된 마지막 행과 열이 있는 이와 같은 행렬은 동차 좌표(Homogeneous Coordinate)라고 하고 평행 이동을 하는 위치 변환을 기존 행렬의 곱셈 규칙에 적용하기 위해서 새로운 축이 필요하다.

 

 

회전을 제어하는 행렬

회전의 기저 벡터는 다음과 같다.

 

 

3차원에서는 x, y, z 각 3개의 축에 대해 오일러 회전을 한다.

https://en.wikipedia.org/wiki/Aircraft_principal_axes
Roll(Z Axis Rotation) / Pitch(X Axis Rotation) / Yaw(Y Axis Rotation)

위에서부터 각각 x축 중심(pitch), y축 중심(yaw), z축 중심(roll) 회전이다.

 

 

이동을 제어하는 행렬

tx, ty, tz는 각각 x, y, z 좌표를 이동하기 위한 이동 값이다.

 

 

행렬의 결합

행렬은 결합하여 사용할 수 있고 먼저 계산 되어야 하는 행렬을 오른쪽에 둔다. 그리고 결합 법칙을 만족하므로 왼쪽부터 계산하면 된다. 교환 법칙은 성립하지 않으므로 순서가 중요하다.

 

 


 

 

MVP 변환

Local Space에서 World Space, 이후 View Space, Clip Space를 거쳐 Screen Space까지 셰이더는 다섯 가지 공간을 다룬다.

행렬은 세 번 곱해지는데 각각 Model, View, Projection 행렬이다. MVP 변환에 사용하는 행렬은 렌더 파이프라인이 제공하는 변수를 사용하면 되고 매 프레임 업데이트 된다.

프로젝트에서 [Packages] - [Universal RP] - [ShaderLibrary] - [Input.hlsl] 파일을 열면 URP가 제공하는 공간 변환용 행렬 변수들을 볼 수 있다. I(Inv)는 역행렬을 의미한다.

 

 

URP 셰이더 라이브러리는 TransformObjectToHClip이라는 함수를 제공해서 Local Space를 Clip Space로 쉽게 바꿀 수 있게 한다. H는 동차 좌표(Homogeneous Coordinate)를 말하며, x, y, z에 추가된 w값이 원근 정보를 담고 있고 View Space의 z값과 같다.

 

 

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                //OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                IN.positionOS += _L;
                float4 posWS = mul(UNITY_MATRIX_M, IN.positionOS); // M
                posWS += _M;
                float4 posVS = mul(UNITY_MATRIX_V, posWS); // V
                posVS += _V;
                OUT.positionHCS = mul(UNITY_MATRIX_P, posVS); // P
                OUT.positionHCS += _P;

                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                OUT.normal = TransformObjectToWorldNormal(IN.normalOS);
                OUT.viewDir = normalize(_WorldSpaceCameraPos.xyz - TransformObjectToWorld(IN.positionOS.xyz));
                OUT.lightDir = normalize(_MainLightPosition.xyz);
                return OUT;
            }

책에 나와있는 MVP 변환을 각각 조정할 수 있는 예제 코드이다. 기본으로 내장되어있던 TransformObjectToHClip을 주석 처리하고 밑에 IN.positionsOS, posWS, posVS, OUT.positionHCS 변수를 추가하였다.

 

 


참고자료

 

아티스트를 위한 유니티 URP 셰이더 입문 - YES24

셰이더(Shader)를 HLSL(High Level Shader Language)로 다루고 싶은 아티스트를 위한 입문서다. 아티스트들의 눈높이에 맞추어 기초 그래픽스 이론과 셰이더 개념을 설명하고, 이를 유니티 엔진에서 활용할

www.yes24.com

728x90
반응형