Unity 컴퓨트 셰이더 가이드
이 문서는 Unity의 컴퓨트 셰이더에 관한 기본 개념과 활용 방법을 설명합니다. 컴퓨트 셰이더는 GPU에서 실행되며 대량 병렬 GPGPU 알고리즘을 지원합니다. Unity에서의 활용 방법에 대해 자세히 알아보겠습니다.
컴퓨트 셰이더란?
- 정의: 컴퓨트 셰이더는 노멀 렌더링 파이프라인과 별도로 GPU에서 실행되는 셰이더 프로그램입니다. 이를 통해 대량의 데이터 처리를 효율적으로 수행할 수 있습니다.
- 사용 목적: 주로 게임의 성능 향상 혹은 복잡한 데이터 처리를 위해 사용됩니다.
지원 플랫폼
컴퓨트 셰이더는 다양한 플랫폼에서 지원됩니다:
| 플랫폼 | API |
|---|---|
| Windows & Windows Store | DirectX 11 / DirectX 12 |
| Mac OS & iOS | Metal |
| Android, Linux, Windows | Vulkan |
| Linux, Windows | OpenGL (최신 버전 지원) |
컴퓨트 셰이더 파일
컴퓨트 셰이더 파일은 .compute 확장자를 가지며, HLSL 언어로 작성됩니다. 최소한 하나의 컴퓨트 커널을 포함해야 합니다.
기본 예제
다음은 출력 텍스처를 빨간색으로 채우는 기본 컴퓨트 셰이더 예제입니다:
// test.compute
#pragma kernel FillWithRed
RWTexture2D<float4> res;
[numthreads(1,1,1)]
void FillWithRed (uint3 dtid : SV_DispatchThreadID)
{
res[dtid.xy] = float4(1,0,0,1);
}
컴퓨트 셰이더 호출하기
컴퓨트 셰이더를 호출하려면 ComputeShader 객체를 생성하고 Dispatch 메소드를 사용하여 실행합니다. ComputeBuffer를 사용하여 데이터를 정의할 수 있으며, 랜덤 쓰기 플래그가 설정된 RenderTextures도 쓸 수 있습니다.
텍스처 샘플러
컴퓨트 셰이더에서 텍스처와 샘플러는 분리된 객체로 다뤄집니다. 샘플러를 정의하려면 다음 규칙을 따릅니다:
- 텍스처 이름과 동일한 이름을 사용해야 함.
- 미리 정의된 샘플러를 사용해야 함.
예를 들어:
Texture2D MyTex;
SamplerState samplerMyTex;
크로스 플랫폼 지원
Unity는 HLSL을 사용해 컴퓨트 셰이더를 다른 언어로 변환합니다. 그러나 플랫폼마다 지원하는 기능이 다를 수 있으므로 주의가 필요합니다.
플랫폼별 고려사항
- Metal: 원자 연산을 지원하지 않음.
- OpenGL ES: 한 번에 4개 이상의 컴퓨트 버퍼 지원하지 않음.
표: RenderTexture GraphicsFormats와 HLSL 타입
| GraphicsFormat | RenderTextureFormat | HLSL 타입 | GLSL 이미지 포맷 한정자 |
|---|---|---|---|
| R32G32B32A32_SFloat | ARGBFloat | float4 | rgba32f |
| R16G16B16A16_SFloat | ARGBHalf | float4/half4 | rgba16f |
| R32G32_SFloat | RGFloat | float2 | rg32f |
| R32_SFloat | RFloat | float | r32f |
| R8G8B8A8_UNorm | ARGB32unorm | float4 | rgba8 |
결론
컴퓨트 셰이더는 Unity에서 복잡한 데이터 처리를 위한 강력한 도구입니다. 위에서 설명한 내용을 바탕으로 더 나아가 효과적인 컴퓨트 셰이더를 작성해 보세요. 추가적으로 Unity의 공식 문서나 커뮤니티 리소스를 통해 더 깊은 학습을 권장합니다.