Unity 공식 가이드 문서 요약 및 활용 예제
이 문서는 Unity에서 여러 그래픽스 API를 위한 셰이더 작성에 관한 내용을 다루고 있으며, 다양한 플랫폼 간의 차이점을 이해하고 관리하는 방법을 설명합니다.
그래픽스 API 간의 차이점
Unity는 다양한 그래픽스 API에서 그래픽 렌더링을 관리하는데, 이들 간의 중요한 차이점을 정리하였습니다.
1. 렌더 텍스처 좌표
| 그래픽스 API | 좌표 규칙 |
|---|---|
| Direct3D 타입 | 좌표가 위쪽에서 0, 아래로 갈수록 증가 |
| OpenGL 타입 | 좌표가 아래쪽에서 0, 위로 갈수록 증가 |
이러한 차이는 이미지 이펙트 및 UV 공간에서 렌더링할 때 문제가 될 수 있습니다.
2. 이미지 이펙트
Direct3D 타입 플랫폼에서 이미지 효과의 소스 텍스처가 OpenGL 타입 규칙에 맞게 플립되지 않을 수 있습니다. 예를 들어, 안티앨리어싱을 적용한 후 화면에 다시 렌더링하는 경우, 좌표를 표준화해야 합니다.
코드 예제
// Flip sampling of the Texture:
// The main Texture
// texel size will have negative Y).
# if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
uv.y = 1 - uv.y;
# endif
3. UV 공간에서 렌더링
Direct3D 타입 투사 좌표가 OpenGL 타입과 일치하도록 좌표를 조정해야 합니다. 이때 ProjectionParams.x 변수의 값을 확인하여 UV 좌표를 변환할 수 있습니다.
코드 예제
float4 vert(float2 uv : TEXCOORD0) : SV_POSITION
{
float4 pos;
pos.xy = uv;
// 指的是上下翻转的投影
if (_ProjectionParams.x < 0)
pos.y = 1 - pos.y;
pos.z = 0;
pos.w = 1;
return pos;
}
클립 공간 좌표
| 그래픽스 API | 클립 공간 뎁스의 범위 |
|---|---|
| Direct3D 타입 | +1.0 (근접 평면) ~ 0.0 (원거리 평면) |
| OpenGL 타입 | -1.0 (근접 평면) ~ +1.0 (원거리 평면) |
클립 공간 좌표의 차이를 해결하기 위해 특정 매크로를 사용하여 자동으로 변환할 수 있습니다.
셰이더 정밀도
모바일 장치와 PC에서 GPU는 데이터 처리 방식이 다릅니다. 따라서 각 플랫폼에서 셰이더의 정밀도를 테스트하는 것이 중요합니다.
4. 셰이더에서의 Const 선언
- HLSL의
const는 읽기 전용 변수입니다. - GLSL의
const는 컴파일 시간 상수입니다.
일관성을 위해 변수를 정의할 때 적절한 타입과 선언 방식을 사용하는 것이 필수적입니다.
셰이더 시맨틱
| 시맨틱 | 용도 |
|---|---|
| SV_POSITION | 클립 공간 포지션을 출력할 때 사용 |
| SV_Target | 프래그먼트 셰이더의 컬러 출력을 지정할 때 사용 |
| PSIZE | 버텍스 셰이더에서 메시 포인트의 크기를 정의할 때 사용 |
Conclusion
이 문서에서는 Unity에서 다양한 그래픽스 API 간의 차이점을 이해하고 이를 해결하기 위한 방법들을 제안했습니다. 각 API의 특성을 고려하여 셰이더를 작성함으로써 최적의 그래픽 성능을 이끌어내는 것이 가능합니다.
추가적으로, 위에서 설명한 코드 스니펫은 필요에 따라 사용자 정의 셰이더에서 직접 활용할 수 있습니다. 이를 통해 더 복잡하고 효과적인 이미지 효과나 렌더링 전략을 구현해 보시기 바랍니다.