2023. 6. 12. 19:14ㆍUnity
크기를 제어하는 행렬
크기를 제어하는 행렬은 위와 같은 형식으로 나타낼 수 있다. 1이 포함된 마지막 행과 열이 있는 이와 같은 행렬은 동차 좌표(Homogeneous Coordinate)라고 하고 평행 이동을 하는 위치 변환을 기존 행렬의 곱셈 규칙에 적용하기 위해서 새로운 축이 필요하다.
회전을 제어하는 행렬
회전의 기저 벡터는 다음과 같다.
3차원에서는 x, y, z 각 3개의 축에 대해 오일러 회전을 한다.
위에서부터 각각 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 변수를 추가하였다.
참고자료
'Unity' 카테고리의 다른 글
[Unity] URP 셰이더 BRDF(양방향 반사도 분포 함수) (0) | 2023.06.13 |
---|---|
[Unity] URP 셰이더 아웃라인 셰이더 (0) | 2023.06.12 |
[Unity] URP 셰이더 HLSL 추가사항 (#pragma, 변수 Scope) (0) | 2023.06.12 |
[Unity] URP 셰이더 HLSL Pass와 Pass Commands (0) | 2023.06.12 |
[Unity] URP 셰이더 HLSL ShaderLab Properties, SubShader Tags (0) | 2023.06.12 |