Compute shader

 컴퓨트 셰이더 - Unity 매뉴얼 (unity3d.com)


컴퓨트 셰이더

컴퓨트 셰이더는 일반 렌더링 파이프라인과 별도로 그래픽 카드에서 실행되는 프로그램입니다. 컴퓨트 셰이더는 대량 병렬 GPGPU 알고리즘 또는 게임 렌더링의 일부를 가속시키기 위해 사용할 수 있습니다. 효율적으로 사용하려면 GPU 아키텍처와 병렬 알고리즘에 대한 깊은 지식뿐만 아니라 DirectComputeOpenGL ComputeCUDA, 또는 OpenCL에 대한 지식도 필요합니다.

Unity의 컴퓨트 셰이더는 DirectX 11 DirectCompute 기술과 거의 일치합니다. 컴퓨트 셰이더가 작동하는 플랫폼은 다음과 같습니다.

  • DirectX 11 또는 DirectX 12 그래픽스 API와 Shader Model 5.0 GPU가 적용된 Windows 및 Windows 스토어

  • Metal 그래픽스 API를 사용하는 Mac OS 및 iOS

  • Vulkan API가 적용된 Android, Linux 및 Windows 플랫폼

  • 최신 OpenGL 플랫폼( Linux 또는 Windows의 경우 OpenGL 4.3, Android의 경우 OpenGL ES 3.1). Mac OS X는 OpenGL 4.3을 지원하지 않습니다.

  • 최신 콘솔(Sony PS4 및 Microsoft Xbox One)

컴퓨트 셰이더 지원은 SystemInfo.supportsComputeShaders를 사용하여 런타임에 쿼리할 수 있습니다.

컴퓨트 셰이더 에셋

일반 셰이더와 유사하게, 컴퓨트 셰이더는 프로젝트에 있는 에셋 파일로, 파일 확장자는 .compute 입니다. DirectX 11 스타일 HLSL 언어로 작성되어 있으며, 어떤 기능을 컴퓨트 셰이더 커널로 컴파일할 것인지 나타내는 최소한의 #pragma 컴파일 지시자를 포함합니다.

다음은 출력 텍스처를 빨간색으로 채우는 컴퓨트 셰이더 파일의 기본 예제입니다.

// 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);
}

언어는 추가 #pragma kernel FillWithRed 지시문이 포함된 스탠다드 DX11 HLSL입니다. 하나의 컴퓨트 셰이더 에셋 파일에는 호출 가능한 최소 한 개의 ’컴퓨트 커널(kernel)’이 포함되어 있어야 하며, 해당 함수는 #pragma directive로 표시되어야 합니다. 파일에는 하나 이상의 커널이 있을 수 있습니다. 여러 #pragma kernel 행을 추가하기만 하면 됩니다.

여러 #pragma kernel 행을 사용하는 경우 #pragma kernel 지시문과 동일한 행에 스타일 // text 주석을 사용할 수 없으므로 컴파일 오류가 발생하면 이를 사용해야 합니다.

#pragma kernel 행에는 선택적으로 해당 커널을 컴파일하는 동안 정의할 수 있는 많은 사전 처리기 매크로가 올 수 있습니다. 예를 들어 다음과 같습니다.

# pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337
# pragma kernel KernelTwo OTHER_DEFINE
// ...

컴퓨트 셰이더 불러오기

스크립트에서 ComputeShader 타입의 변수를 정의하고 에셋에 대한 레퍼런스를 할당하면 ComputeShader.Dispatch 함수를 사용하여 불러올 수 있습니다. 자세한 내용은 ComputeShader 클래스의 Unity 문서를 참조하십시오.

컴퓨트 셰이더와 밀접한 관련이 있는 것은 ComputeBuffer 클래스로 임의의 데이터 버퍼(DX11 언어의 “구조화된 버퍼”)를 정의합니다. “랜덤 액세스” 플래그가 설정되었을 경우(DX11의 “정렬되지 않은 액세스 뷰”) Render Textures도 컴퓨트 셰이더에서 쓰기 가능합니다. 자세한 내용은 RenderTexture.enableRandomWrite를 참조하십시오.

컴퓨트 셰이더의 텍스처 샘플러

텍스처와 샘플러는 Unity에서 별개의 오브젝트가 아니므로, 컴퓨트 셰이더에서 사용하려면 다음과 같은 Unity 관련 규칙 중 하나를 따라야 합니다.

  • 텍스처 이름과 동일한 이름을 사용하고 처음에는 sampler를 사용해야 합니다(예: Texture2D MyTexSamplerState samplerMyTex). 이 경우, 샘플러는 텍스처의 filter/wrap/aniso 설정으로 초기화됩니다.

  • 미리 정의된 샘플러를 사용해야 합니다. 이를 위해 이름은 Linear 또는 Point(필터 모드의 경우) 및 Clamp 또는 Repeat(랩 모드의 경우)가 있어야 합니다. 예를 들어 SamplerState MyLinearClampSampler는 선형 필터 모드와 클램프 랩 모드가 있는 샘플러를 만듭니다.

보다 자세한 내용은 샘플러 상태 문서를 참조하십시오.

크로스 플랫폼 지원

댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

C++ 생성자 위임 (delegating constructor)