URP 언릿 기본 셰이더
이 예제는 기본 URP 호환 셰이더를 보여줍니다. 이 셰이더는 셰이더 코드에 사전 정의된 컬러로 메시 모양을 채웁니다.
동작 중인 셰이더를 확인하려면 다음 ShaderLab 코드를 복사하여 셰이더 에셋에 붙여 넣으십시오.
// 이 셰이더는 코드에 사전 정의된 컬러로 메시 모양을 채웁니다.
Shader "Example/URPUnlitShaderBasic"
{
// Unity 셰이더의 프로퍼티 블록입니다. 이 예제에서 이 블록은 비어 있습니다.
// 출력 컬러가 프래그먼트 셰이더 코드에 사전 정의되어 있기 때문입니다.
Properties
{ }
// 셰이더 코드가 포함된 서브셰이더 블록입니다.
SubShader
{
// 서브셰이더 태그는 서브셰이더 블록 또는 패스가 실행되는 시기와
// 조건을 정의합니다.
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
// HLSL 코드 블록입니다. Unity SRP는 HLSL 언어를 사용합니다.
HLSLPROGRAM
// 이 줄은 버텍스 셰이더의 이름을 정의합니다.
#pragma vertex vert
// 이 줄은 프래그먼트 셰이더의 이름을 정의합니다.
#pragma fragment frag
// Core.hlsl 파일에는 자주 사용되는 HLSL 매크로 및 함수에 대한 정의가 포함되어 있으며,
// 다른 HLSL 파일(예: Common.hlsl, SpaceTransforms.hlsl 등)에 대한
// #include 레퍼런스도 포함되어 있습니다.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// 구조 정의는 포함하는 변수를 정의합니다.
// 이 예제에서는 버텍스 셰이더의 입력 구조로 Attributes
// 구조를 사용합니다.
struct Attributes
{
// positionOS 변수에는 오브젝트 공간의 버텍스 포지션이
// 포함됩니다.
float4 positionOS : POSITION;
};
struct Varyings
{
// 이 구조체의 포지션에는 SV_POSITION 시맨틱이 있어야 합니다.
float4 positionHCS : SV_POSITION;
};
// Varyings 구조에 정의된 프로퍼티가 있는 버텍스 셰이더
// 정의입니다. vert 함수의 타입은 반환하는 타입(구조체)과
// 일치해야 합니다.
Varyings vert(Attributes IN)
{
// 출력 오브젝트(OUT)를 Varyings 구조체로 선언합니다.
Varyings OUT;
// TransformObjectToHClip 함수는 버텍스 포지션을 오브젝트 공간에서
// 균일한 클립 공간으로 변환합니다.
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
// 출력을 반환합니다.
return OUT;
}
// 프래그먼트 셰이더 정의입니다.
half4 frag() : SV_Target
{
// 컬러 변수를 정의하고 반환합니다.
half4 customColor = half4(0.5, 0, 0, 1);
return customColor;
}
ENDHLSL
}
}
}
프래그먼트 셰이더는 게임 오브젝트에 암적색(RGB 값(0.5, 0, 0))을 지정합니다.
다음 섹션에서는 기본 Unity 셰이더의 구조에 대해 소개합니다.
기본 ShaderLab 구조
Unity 셰이더는 ShaderLab이라는 Unity 전용 언어로 작성됩니다.
이 예제의 Unity 셰이더에는 다음의 블록이 포함되어 있습니다.
셰이더 블록
ShaderLab 코드는 Shader
선언으로 시작합니다.
셰이더 "Example/URPUnlitShaderBasic"
이 선언의 경로는 머티리얼의 셰이더 메뉴에 있는 Unity 셰이더의 표시 이름과 위치를 결정합니다. Shader.Find 메서드도 이 경로를 사용합니다.
프로퍼티 블록
프로퍼티 블록에는 사용자가 머티리얼의 인스펙터 창에서 설정할 수 있는 프로퍼티의 선언이 포함되어 있습니다.
이 예제의 프로퍼티 블록은 비어 있는데, 이는 Unity 셰이더가 사용자가 정의할 수 있는 Material 프로퍼티를 노출하지 않기 때문입니다.
서브셰이더 블록
Unity 셰이더 소스 파일에는 하나 이상의 서브셰이더 블록이 포함되어 있습니다. 메시를 렌더링할 때 Unity는 타겟 디바이스의 GPU와 호환되는 첫 번째 서브셰이더를 선택합니다.
서브셰이더 블록은 선택적으로 서브셰이더 태그 블록을 포함할 수 있습니다. 서브셰이더 태그 블록을 선언하려면 Tags
키워드를 사용하십시오.
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
이름이 RenderPipeline
인 서브셰이더 태그는 이 서브셰이더를 사용할 렌더 파이프라인을 Unity에 알려 주며, UniversalPipeline
값은 Unity가 이 서브셰이더를 URP에 사용해야 함을 나타냅니다.
다른 렌더 파이프라인에서 동일한 셰이더를 실행하려면 다른 RenderPipeline
태그 값이 있는 여러 개의 서브셰이더 블록을 생성하십시오. HDRP에서 서브셰이더 블록을 실행하려면 RenderPipeline
태그를 HDRenderPipeline
으로 설정하고, 빌트인 렌더 파이프라인에서 실행하려면 RenderPipeline
을 빈 값으로 설정하십시오.
서브셰이더 태그에 대한 자세한 내용은 ShaderLab: 서브셰이더 태그를 참조하십시오.
패스 블록
이 예제에는 HLSL 프로그램 코드를 포함하는 하나의 패스 블록이 있습니다. 패스 블록에 대한 자세한 내용은 ShaderLab: 패스를 참조하십시오.
패스 블록은 선택적으로 패스 태그 블록을 포함할 수 있습니다. 자세한 내용은 URP ShaderLab 패스 태그를 참조하십시오.
HLSLPROGRAM 블록
이 블록에는 HLSL 프로그램 코드가 포함되어 있습니다.
참고: HLSL 언어는 URP 셰이더에 선호되는 언어입니다.
참고: URP는 CG 언어를 지원합니다. 셰이더에 CGPROGRAM/ENDCGPROGRAM 블록을 추가하면 Unity는 빌트인 렌더 파이프라인 라이브러리의 셰이더를 자동으로 포함합니다. SRP 셰이더 라이브러리의 셰이더를 포함하면 일부 SRP 셰이더 매크로 및 함수가 빌트인 렌더 파이프라인 셰이더 함수와 충돌할 수 있습니다. CGPROGRAM 블록이 포함된 셰이더는 SRP 배처와 호환됩니다.
이 블록에는 Core.hlsl
파일을 참조하는 #include
선언이 포함되어 있습니다.
# include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
Core.hlsl
파일에는 HLSL 매크로와 함수에서 자주 사용되는 정의뿐만 아니라 다른 HLSL 파일에 대한 레퍼런스(예: Common.hlsl
및 SpaceTransforms.hlsl
)도 포함되어 있습니다.
예를 들어 HLSL 코드의 버텍스 셰이더는 SpaceTransforms.hlsl
파일의 TransformObjectToHClip
함수를 사용합니다. 이 함수는 오브젝트 공간의 버텍스 포지션을 균일한 공간으로 변환합니다.
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
이 기본 HLSL 코드의 프래그먼트 셰이더는 코드에 사전 정의된 단일 컬러를 출력합니다.
half4 frag() : SV_Target
{
half4 customColor;
customColor = half4(0.5, 0, 0, 1);
return customColor;
}
컬러 입력을 제공하는 URP 언릿 셰이더 섹션에서는 머티리얼의 인스펙터 창에 편집 가능한 컬러 프로퍼티를 추가하는 방법을 설명합니다.