커스텀 패스 만들기
커스텀 패스를 만들려면 GameObject > Volume > Custom Pass를 사용하여 씬에 Custom Pass Volume 컴포넌트를 추가합니다. 이렇게 하면 Custom Pass Volume 컴포넌트를 포함하는 Custom Pass라고 하는 게임 오브젝트가 생성됩니다. 이 컴포넌트를 사용하여 커스텀 패스를 만들고 설정할 수 있습니다.
Custom Pass Volume 컴포넌트 프로퍼티
프로퍼티 | 설명 |
---|---|
Mode | 드롭다운을 사용하여 이 커스텀 패스 볼륨이 카메라에 영향을 줄 수 있는지 여부를 결정하기 위해 Unity가 사용하는 메서드를 선택합니다. • Global: 이 커스텀 패스 볼륨은 경계가 없고 씬의 모든 카메라에 영향을 줄 수 있습니다. • Local: 경계 안의 카메라에만 영향을 줄 수 있도록 커스텀 패스 볼륨에 대한 경계를 지정할 수 있습니다. 경계를 설정하려면 커스텀 패스 볼륨의 게임 오브젝트에 콜라이더를 추가합니다. |
Injection point | 드롭다운을 사용하여 Unity가 HDRP 렌더 루프에서 이 커스텀 패스를 실행할 시기를 정의합니다. 각 주입 지점에 대한 자세한 내용은 [주입 지점](#Injection Points.md)을 참조하십시오. |
Priority | 동일한 주입 지점에 할당된 둘 이상의 커스텀 패스 볼륨이 있는 경우 이 프로퍼티를 사용하여 Unity가 커스텀 패스 볼륨을 실행할 순서를 제어합니다. Unity는 0부터 시작하는 우선순위로 이러한 볼륨을 실행합니다. |
Fade Radius | 볼륨에 접근할 때 Unity가 커스텀 패스 효과를 페이드인하기 시작할 시기를 정의합니다. 값이 0이면 HDRP가 이 볼륨의 효과를 볼륨 가장자리에 즉시 적용한다는 의미입니다. 값이 높으면 효과가 볼륨에서 멀리 떨어져서 나타나기 시작한다는 의미입니다. 이 프로퍼티는 Mode가 Local에 설정된 경우에만 나타납니다. |
Custom Passes | 추가(+) 버튼을 클릭하여 커스텀 패스를 만듭니다. Custom Pass Volume 컴포넌트에는 다음과 같이 기본적으로 사용할 수 있는 커스텀 패스 타입이 있습니다. • FullScreen Custom Pass: 이 패스를 사용하여 Unity가 카메라 뷰에 적용하거나 커스텀 패스 버퍼에 저장하는 효과를 실행합니다. 자세한 내용은 전체 화면 커스텀 패스를 참조하십시오. • DrawRenderers Custom Pass: 이 패스를 사용하여 카메라 뷰에 있는 게임 오브젝트에 커스텀 패스를 적용합니다. 자세한 내용은 드로우 렌더러 커스텀 패스를 참조하십시오. 자체 커스텀 패스를 만드는 경우 해당 패스도 이 드롭다운에 나타납니다. 자세한 내용은 C#으로 자체 커스텀 패스 스크립팅을 참조하십시오. 이 컴포넌트에 하나 이상의 커스텀 패스가 있는 경우 **-** 을 클릭하여 삭제할 수 있습니다. |
전체 화면 커스텀 패스
전체 화면 커스텀 패스는 화면 전체에 효과를 적용합니다. 이를 위해 이 패스는 전체 화면 커스텀 패스와 함께 사용하도록 설정된 머티리얼을 사용하여 전체 화면 사각형을 렌더링하고 화면의 모든 픽셀에 프래그먼트 셰이더를 실행합니다.
전체 화면 커스텀 패스를 생성하려면 Custom Pass Volume 컴포넌트 오른쪽 하단에 있는 추가(+) 버튼을 클릭하고 FullScreeenCustomPass를 선택합니다.
FullScreenCustomPass 프로퍼티
다음의 프로퍼티를 사용하여 커스텀 패스 패널에서 전체 화면 커스텀 패스를 설정할 수 있습니다.
프로퍼티 | 설명 |
---|---|
이름 | 이 필드를 사용하여 이 커스텀 패스에 이름을 지정합니다. Unity는 이 이름을 사용하여 프로파일러에 있는 이 커스텀 패스 볼륨을 참조합니다. |
Target Color Buffer | Unity가 컬러 데이터를 작성할 버퍼를 선택합니다. Camera: 커스텀 패스를 렌더링하는 현재의 카메라 컬러 버퍼를 타겟으로 합니다. Custom: HDRP 에셋에 할당된 커스텀 패스 버퍼를 사용합니다. None: 버퍼에 데이터를 작성하지 않습니다. Fetch Color Buffer가 활성화되어 있는 경우 카메라 컬러 버퍼에 컬러 데이터를 작성할 수 없습니다. Target Color Buffer와 Target Buffer가 모두 None으로 설정되어 있으면 Unity는 렌더링할 버퍼가 없으므로 커스텀 패스를 실행하지 않습니다. |
Target Depth Buffer | Unity가 뎁스와 스텐실 데이터를 작성하고 테스트할 버퍼를 선택합니다. 이 버퍼에는 셰이더 프로퍼티에 활성화된 Depth Write가 있는 투명 오브젝트가 포함되어 있지 않습니다. Target Color Buffer와 Target Buffer가 모두 None으로 설정되어 있으면 Unity는 렌더링할 버퍼가 없으므로 커스텀 패스를 실행하지 않습니다. |
Clear Flags | 지우기 플래그는 Unity가 이 커스텀 패스를 실행하기 전에 버퍼의 콘텐츠를 폐기합니다. 이 프로퍼티는 다음 버퍼 중 하나에 지우기 플래그를 할당합니다. None: 이 패스에 있는 버퍼를 지우지 않습니다. Color: 뎁스 버퍼를 지웁니다. Depth: 뎁스 버퍼와 스텐실 버퍼를 지웁니다. All: 컬러, 뎁스, 스텐실 버퍼에 있는 데이터를 지웁니다. |
Fetch Color Buffer | 이 체크박스를 활성화하면 이 커스텀 패스가 컬러 버퍼에서 데이터를 읽을 수 있습니다. 이는 멀티샘플링 안티앨리어싱(MSAA)이 활성화되어 있을 때에도 적용됩니다. Fetch Color Buffer와 MSAA가 활성화되면 해당 컬러 버퍼를 강제로 결정하며 커스텀 패스는 다음의 주입 지점 중 하나를 사용합니다. Before PreRefraction Before Transparent After Opaque Depth And Normal 커스텀 패스는 동일한 렌더 타겟을 읽고 작성할 수 없습니다. 즉 Fetch Color Buffer를 활성화하고 동시에 Target Color Buffer를 사용할 수 없습니다. |
FullScreen Material | 이 커스텀 패스가 씬에 렌더링하는 머티리얼입니다. |
Pass Name | Unity가 전체 화면 사각형을 드로우하기 위해 사용하는 셰이더 패스 이름을 선택합니다. |
전체 화면 커스텀 패스와 함께 사용할 머티리얼 생성
전체 화면 커스텀 패스를 사용하려면 씬에서 사용할 커스텀 패스용 셰이더를 만들어야 합니다. Unity에는 전체 화면 커스텀 패스용 특정 타입의 셰이더가 있습니다. 호환 가능한 셰이더를 만들려면 다음 단계를 따르십시오.
- 전체 화면 커스텀 패스 셰이더를 만듭니다. 이렇게 하려면 Assets > Create > Shader > HDRP > Custom FullScreen Pass로 이동합니다.
- Hierarchy로 이동하여 Custom FullScreen Pass 셰이더에서 오른쪽 클릭한 다음 Create > Material을 선택합니다. Unity는 접두사로 “FullScreen_”이 있는 새로운 머티리얼을 만듭니다.
- Custom Pass 컴포넌트에서
**+**
를 클릭하여 커스텀 패스를 만들고 FullScreenCustomPass를 선택합니다. - 이 머티리얼을 FullScreenCustomPass에 할당하려면 FullScreen Material 상자의 오른쪽에 있는 아이콘을 사용하여 머티리얼 피커를 열고 “FullScreen_...” 머티리얼을 선택합니다.
- 여러 커스텀 패스가 있는 경우 이 패스에서 사용할 Pass Name을 선택합니다.
전체 화면 커스텀 패스에 대한 Unity 셰이더 편집
Unity가 전체 화면 커스텀 패스와 함께 사용할 머티리얼을 만들 때 Unity 셰이더에 기본 템플릿 코드를 추가합니다.
Unity 셰이더를 편집하려면 다음 단계를 따르십시오.
- Assets 창에서 머티리얼을 선택합니다.
- Inspector로 이동합니다.
- Open을 클릭합니다.
이 Unity 셰이더 소스 파일에는 다음과 같은 FullScreenPass
메서드가 포함됩니다. 여기에서 전체 화면 커스텀 패스에 대한 커스텀 셰이더 코드를 추가할 수 있습니다.
float4 FullScreenPass(Varyings varyings) : SV_Target
{
float depth = LoadCameraDepth(varyings.positionCS.xy);
PositionInputs posInput = GetPositionInput(varyings.positionCS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
float3 viewDirection = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
float4 color = float4(0.0, 0.0, 0.0, 0.0);
// Load the camera color buffer at the mip 0 if not currently in the BeforeRendering injection point
if (_CustomPassInjectionPoint != CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING)
color = float4(CustomPassLoadCameraColor(varyings.positionCS.xy, 0), 1);
// Add your custom pass code here
// Fade value allows you to increase the strength of the effect while the camera gets closer to the custom pass volume
float f = 1 - abs(_FadeValue * 2 - 1);
return float4(color.rgb + f, color.a);
}
FullScreenPass 메서드는 다음의 입력 데이터를 페치합니다.
- 뎁스
- 뷰 방향
- 월드 공간에서의 포지션
- 컬러
FullScreenPass
메서드에는 또한 _FadeValue
변수가 포함되며 이를 사용하여 카메라가 커스텀 패스 볼륨에 가까워질수록 효과의 강도를 높일 수 있습니다. 이 변수는 Fade Radius가 할당되어 있는 로컬 커스텀 패스 볼륨에서만 작동합니다.
드로우 렌더러 커스텀 패스
드로우 렌더러 커스텀 패스를 사용하여 카메라 뷰에 있는 게임 오브젝트에 효과를 적용할 수 있습니다.
또한 HD Camera 컴포넌트의 Culling Mask 드롭다운 프로퍼티에 있는 옵션을 사용하여 카메라 뷰 밖의 오브젝트에 효과를 적용하기 위해 이 커스텀 패스를 사용할 수도 있습니다.
드로우 렌더러 커스텀 패스를 생성하려면 Custom Pass Volume 컴포넌트에 있는 추가(+) 버튼을 클릭하고 DrawRenderersCustomPass를 선택합니다.
드로우 렌더러 커스텀 패스 프로퍼티
다음의 프로퍼티를 사용하여 Custom Passes 패널에서 드로우 렌더러 커스텀 패스를 설정할 수 있습니다.
프로퍼티 | 설명 |
---|---|
이름 | 이 필드를 사용하여 이 커스텀 패스 이름을 지정합니다. Unity는 디버깅을 위한 프로파일링 마커 이름으로 이것을 사용합니다. |
Target Color Buffer | Unity가 컬러 데이터를 입력할 버퍼를 선택합니다. Camera: 커스텀 패스를 렌더링하는 현재의 카메라 컬러 버퍼를 타겟으로 합니다. Custom: HDRP 에셋에 할당된 커스텀 패스 버퍼를 사용합니다. None: 버퍼에 데이터를 작성하지 않습니다. |
Target Depth Buffer | Unity가 뎁스와 스텐실 데이터를 작성하고 테스트하는 타겟 버퍼입니다. Camera: 커스텀 패스를 렌더링하는 현재의 카메라 뎁스 버퍼를 타겟으로 합니다. Custom: HDRP 에셋에 할당된 커스텀 패스 버퍼를 사용합니다. None: 데이터를 버퍼에 작성하지 않습니다. 이 버퍼에는 셰이더 프로퍼티에서 활성화된 Depth Write가 있는 투명 오브젝트가 포함되어 있지 않습니다. |
Clear Flags | 지우기 플래그는 Unity가 이 커스텀 패스를 실행하기 전에 버퍼의 콘텐츠를 폐기합니다. 이 프로퍼티는 다음 버퍼 중 하나에 지우기 플래그를 할당합니다. None: 이 패스에 있는 버퍼를 지우지 않습니다. Color: 뎁스 버퍼를 지웁니다. Depth: 뎁스 버퍼와 스텐실 버퍼를 지웁니다. All: 컬러, 뎁스, 스텐실 버퍼에 있는 데이터를 지웁니다. |
Filters | 이 섹션은 Unity가 이 커스텀 패스에서 렌더링하는 게임 오브젝트를 결정합니다. |
Queue | 이 커스텀 패스가 렌더링하는 머티리얼의 종류를 선택합니다. |
Layer Mask | 이 커스텀 패스가 적용할 게임 오브젝트 레이어를 선택합니다. |
Overrides | |
Material | 이 커스텀 패스에 포함된 모든 것의 머티리얼을 오버라이드하기 위해 이 커스텀 패스 볼륨이 사용하는 머티리얼을 선택합니다. 이 필드는 언릿 셰이더 그래프나 언릿 HDRP Unity 셰이더, 릿 셰이더를 허용합니다. 호환할 수 있는 머티리얼의 전체 리스트는 머티리얼 및 주입 지점 호환성을 참조하십시오. 메뉴에서 Create > Shader > HDRP > Custom Renderers Pass를 사용하여 드로우 렌더러 커스텀 패스와 호환할 수 있는 Unity 셰이더를 만들 수 있습니다. |
Pass Name | 이 필드는 머티리얼을 Material 필드에 할당할 때 나타납니다. 이 필드에 대한 드롭다운 옵션은 Material 필드에 할당한 머티리얼에 따라 달라집니다. Unity가 전체 화면 사각형을 드로우하는 데 사용하는 커스텀 패스를 선택합니다. 이 커스텀 패스를 사용하여 여러 커스텀 패스 효과 사이를 전환할 수 있습니다. |
Override Depth | 이 체크박스를 활성화하여 렌더링된 게임 오브젝트의 머티리얼에 있는 뎁스 렌더 상태를 오버라이드합니다. 이렇게 하면 기본 Depth Test 값을 교체하고 커스텀 값을 사용하여 뎁스를 작성할 수 있습니다. |
Depth Test | 게임 오브젝트를 렌더링할 때 Unity는 게임 오브젝트가 다른 오브젝트 뒤에 있는지 확인하기 위해 Depth Test 값을 사용합니다. 이를 수행하기 위해 Unity는 제공된 게임 오브젝트 픽셀의 z 값(뎁스)을 테스트하고 뎁스 버퍼에 저장되어 있는 값에 비교합니다. 기본적으로 Depth Test는 Less Equal로 설정되어 있으며 원본 오브젝트가 비교군 오브젝트 앞에 나타나도록 합니다. 드롭다운을 사용하여 뎁스 테스트에 사용할 비교 메서드를 선택합니다. 각 비교 메서드는 셰이더가 렌더링하는 방법을 변경합니다. Disabled: 뎁스 테스트를 수행하지 않습니다. Never: 뎁스 테스트를 통과하지 않습니다. Less: 픽셀의 z 값이 저장된 값보다 작을 경우 뎁스 테스트를 통과합니다. Equal: 픽셀의 z 값이 저장된 값과 같을 경우 뎁스 테스트를 통과합니다. Less Equal: 픽셀의 z 값이 Z 버퍼 값보다 작거나 같을 경우 뎁스 테스트를 통과합니다. 이렇게 하면 테스트된 픽셀이 다른 픽셀 앞에 렌더링됩니다. Greater: 픽셀의 z 값이 저장된 값보다 클 경우 뎁스 테스트를 통과합니다. Not Equal: 픽셀의 z 값이 저장된 값과 같지 않을 경우 뎁스 테스트를 통과합니다. Greater Equal: 픽셀의 z 값이 저장된 값보다 크거나 같을 경우 뎁스 테스트를 통과합니다. Always: 뎁스 테스트를 항상 통과하며 저장된 값과 비교하지 않습니다. 이 설정은 Override Depth를 활성화한 경우에만 나타납니다. |
Write Depth | Write Depth를 활성화하여 Unity가 이 머티리얼을 사용하는 게임 오브젝트에 대한 뎁스 값을 작성하도록 합니다. Unity가 각 게임 오브젝트에 대한 뎁스 값을 작성하지 않도록 하려면 이 옵션을 비활성화합니다. |
Sorting | Unity가 게임 오브젝트를 렌더링하기 전에 씬에서 정렬하는 방식을 선택합니다. 자세한 내용은 정렬 기준을 참조하십시오. |
ForwardOnly 지원
Unity는 Pass Name을 사용하여 HDRP 머티리얼에 렌더링할 셰이더 패스를 선택합니다. 오브젝트 컬러를 렌더링하려면 Forward나 ForwardOnly를 선택합니다. 오브젝트의 뎁스만 렌더링하려면 DepthForwardOnly 패스 이름을 사용합니다.
새로운 드로우 렌더러 커스텀 패스를 만들 때 다음의 경고가 나타나면 HDRP 에셋 설정 때문일 수 있습니다.
이를 수정하려면 Assets 폴더의 HDRP 에셋으로 이동하고(HDRP 템플릿을 사용 중인 경우에는 Assets > Settings에 있음) Lit Shader Mode를 Both로 변경합니다. 자세한 내용은 씬에서 렌더러 뎁스 변경을 참조하십시오.
머티리얼 및 주입 지점 호환성
주입 지점은 Unity가 렌더 루프에 커스텀 패스 볼륨을 실행하는 시기를 결정합니다.
하지만 드로우 렌더러 커스텀 패스의 모든 주입 지점에서는 일부 머티리얼만 지원합니다. 다음 표에는 각 주입 지점이 드로우 렌더러 커스텀 패스에 대해 지원하는 머티리얼이 나열되어 있습니다.
주입 지점 | 지원하는 머티리얼 타입 |
---|---|
Before Rendering | 언릿 포워드(카메라 컬러에 작성하지는 않음) |
After Opaque Depth And Normal | 언릿 포워드 |
Before PreRefraction | 언릿 포워드와 릿 포워드 전용 |
Before Transparent | 굴절이 있는 언릿 포워드와 릿 포워드 전용 |
Before Post Process | 굴절이 있는 언릿 포워드와 릿 포워드 전용 |
After Post Process | 굴절이 있는 언릿 포워드와 릿 포워드 전용 |
Unity가 현재의 주입 지점이 지원하지 않는 머티리얼을 렌더링하면 정의되지 않은 동작이 발생합니다. 예를 들어 After Opaque Depth And Normal 주입 지점에서 릿 셰이더로 게임 오브젝트를 렌더링하면 예기치 않은 결과를 생성합니다.
커스텀 렌더러 패스 셰이더
커스텀 렌더러 패스 셰이더를 사용하여 고급 커스텀 패스 효과를 만들 수 있습니다. 이 셰이더를 만들려면 Assets > Create > Shader > HDRP > Custom Renderers Pass로 이동합니다. 이렇게 하면 New Renderers CustomPass라는 이름의 언릿 HDRP 셰이더가 생성됩니다. 이 Unity 셰이더에는 ShaderLab 패스가 하나 있습니다.
고급 효과를 만들기 위해 커스텀 렌더러 패스 셰이더 사용
HDRP는 렌더 파이프라인이 씬에 머티리얼을 렌더링하기 위해 사용하는 데이터를 저장하는 특정 셰이더 구조를 포함합니다. 프래그먼트 셰이더 코드 섹션은 이러한 구조를 설명합니다.
프래그먼트 셰이더 코드
커스텀 렌더러 패스 셰이더에 프래그먼트 셰이더 코드를 작성하려면 GetSurfaceAndBuiltinData
메서드를 사용합니다.
이 메서드는 다음의 입력을 허용합니다.
- 프래그먼트 셰이더에 입력된 모든 지오메트리 입력을 포함하는
FragInputs
구조체입니다. 이 구조체의 프로퍼티에 대한 자세한 내용은 FragInput을 참조하십시오. float3
은 현재의 픽셀 뷰 방향을 포함합니다.- 셰이더에서 필요할 수 있는 포지션 기반 유틸리티 프로퍼티를 포함하는
PositionInputs
구조체입니다. 이 구조체의 프로퍼티에 대한 자세한 내용은 PositionInputs을 참조하십시오.
GetSurfaceAndBuiltinData
메서드는 결과를 출력하기 위해 return
을 사용하지 않습니다. 대신 out 조정값을 사용하는 두 가지 파라미터가 있습니다. 그 이유는 셰이더의 표면 타입에 따라 다른 출력을 지원하기 때문입니다. 출력은 다음과 같습니다.
SurfaceData
구조체는 최종 컬러를 포함합니다. 이 구조체의 프로퍼티에 대한 자세한 내용은 SurfaceData를 참조하십시오.- A
BuiltinData
구조체는 HDRP가 특정 효과를 계산하기 위해 사용할 수 있는 추가 정보를 포함합니다. 이 구조체의 프로퍼티에 대한 자세한 내용은 BuiltinData를 참조하십시오.
다음의 예시는 프래그먼트 셰이더 코드를 작성하기 위해 GetSurfaceAndBuiltinData
메서드를 사용하는 방법을 설명합니다. 이 예시는 _ColorMap
텍스처의 컬러를 샘플링하고 알파 채널을 사용하여 알파 테스트를 수행한 다음 표면에 대한 텍스처 컬러를 출력합니다.
// Put the code to render the GameObjects in your Custom Pass in this method
void GetSurfaceAndBuiltinData(FragInputs fragInputs, float3 viewDirection, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData)
{
float2 colorMapUv = TRANSFORM_TEX(fragInputs.texCoord0.xy, _ColorMap);
float4 result = SAMPLE_TEXTURE2D(_ColorMap, s_trilinear_clamp_sampler, colorMapUv) * _Color;
float opacity = result.a;
float3 color = result.rgb;
# ifdef _ALPHATEST_ON
DoAlphaTest(opacity, _AlphaCutoff);
# endif
// Write back the data to the output structures
ZERO_INITIALIZE(BuiltinData, builtinData); // No call to InitBuiltinData as we don't have any lighting
builtinData.opacity = opacity;
builtinData.emissiveColor = float3(0, 0, 0);
surfaceData.color = color;
}
FragInputs
FragInputs
는 프래그먼트 단계로 전달되는 모든 지오메트리 입력을 저장하는 구조체입니다.
struct FragInputs
{
float4 positionSS; // In case depth offset is use, positionRWS.w is equal to depth offset
float3 positionRWS; // Relative camera space position
float4 texCoord0; // UV0
float4 texCoord1; // UV1
float4 texCoord2; // UV2
float4 texCoord3; // UV3
float4 color; // vertex color
float3x3 tangentToWorld;
bool isFrontFace;
};
PositionInputs
PositionInputs
은 셰이더에서 사용해야 할 수 있는 다른 프로퍼티 세트를 제공합니다. 포지션과 관련된 프로퍼티에 접근하기 위한 유틸리티 구조로 생각할 수 있습니다. 해당 뎁스는 현재의 카메라 뎁스 버퍼에서 가져오고 tileCoord
는 사용할 수 없습니다(컴퓨트 셰이더에서만 사용).
struct PositionInputs
{
float3 positionWS; // World space position (could be camera-relative)
float2 positionNDC; // Normalized screen coordinates within the viewport : [0, 1) (with the half-pixel offset)
uint2 positionSS; // Screen space pixel coordinates : [0, NumPixels)
uint2 tileCoord; // Screen tile coordinates : [0, NumTiles)
float deviceDepth; // Depth from the depth buffer : [0, 1] (typically reversed)
float linearDepth; // View space Z coordinate : [Near, Far]
};
SurfaceData
SurfaceData
구조체를 사용하여 오브젝트의 표면 컬러를 설정할 수 있습니다. 각 머티리얼 타입에 따라 다르게 표현합니다. 언릿 셰이더의 경우 언릿 오브젝트의 컬러를 표현하는 단일 필드만 포함됩니다.
struct SurfaceData
{
float3 color;
};
BuiltinData
BuiltinData
구조체에는 HDRP에 전달할 수 있는 추가 정보가 포함되어 있습니다.
struct BuiltinData
{
real opacity; // Translucency of your object
real alphaClipTreshold; // The threshold for alpha clipping
real3 bakeDiffuseLighting;
real3 backBakeDiffuseLighting;
real shadowMask0;
real shadowMask1;
real shadowMask2;
real shadowMask3;
real3 emissiveColor; // Emissive color
real2 motionVector; // Not yet supported
real2 distortion; // Distortion vector
real distortionBlur; // Distortion blur level [0, 1]
uint renderingLayers;
float depthOffset; // Depth offset
real4 vtPackedFeedback;
};
버텍스 셰이더 코드
커스텀 렌더러 패스 셰이더에 버텍스 셰이더 코드를 작성하려면 ApplyMeshModification 메서드를 사용합니다. 기본적으로 이 셰이더는 이 메서드를 주석으로 처리하므로 이 메서드를 사용하려면 주석 슬래시(//)를 제거합니다. 이 메서드를 사용하여 버텍스 변형이나 버텍스 애니메이션을 Unity 셰이더에 추가할 수 있습니다.
입력을 위해 이 메서드는 다음을 사용합니다.
- AttributeMesh 구조체는 현재의 버텍스와 해당 프로퍼티를 포함합니다. 이 구조체의 프로퍼티와 그 프로퍼티가 매핑하는 정의에 대한 자세한 내용은 AttributeMesh를 참조하십시오.
- float3은 현재의
timeParameters
를 포함합니다. 이 플로트에서 x 값은 시간(초)을 나타내고 y 값은 sin(x)이고 z 값은 cos(x)입니다.
출력을 위해 이 메서드는 수정된 버텍스를 나타내는 AttributeMesh
를 반환합니다. 일반 워크플로는 입력 AttributeMesh
를 수정하고 반환하는 것입니다.
이 메서드의 변환은 오브젝트 공간에 있습니다. 월드 공간에 변환을 적용하려면 다음 단계를 따르십시오.
- 오브젝트 공간 데이터를 월드 공간으로 전환합니다.
TransformObjectToWorld
메서드를 사용하여 노멀 데이터를 전환하기 위해 포지션 데이터와TransformObjectToWorldDir
을 전환합니다. - 변환을 적용합니다.
- 월드 공간 데이터를 다시 오브젝트 공간으로 전환합니다.
TransformWorldToObject
메서드를 사용하여 노멀 데이터로 전환하기 위해 포지션 데이터와TransformWorldToObjectDir
을 전환합니다.
버텍스 셰이더 코드를 작성하기 위해 이 메서드를 사용하는 방법에 대한 예시는 다음의 코드 샘플을 참조하십시오. 이 예시는 버텍스 데이터를 수정하여 메시를 약간 확대하고 z-fighting을 방지합니다.
# define HAVE_MESH_MODIFICATION
AttributesMesh ApplyMeshModification(AttributesMesh input, float3 timeParameters)
{
input.positionOS += input.normalOS * 0.0001; // Enlarges the mesh slightly to avoid z-fighting.
return input;
}
AtrributeMesh
AttributesMesh
구조체에는 다음의 정의가 있습니다.
struct AttributesMesh
{
float3 positionOS : POSITION;
float3 normalOS : NORMAL;
float4 tangentOS : TANGENT; // Store sign in w
float2 uv0 : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float2 uv2 : TEXCOORD2;
float2 uv3 : TEXCOORD3;
float4 color : COLOR;
};
프래그먼트 셰이더에서 UV 샘플링
Unity는 데이터를 버텍스와 프래그먼트 셰이더에 보내기 위해 다음의 정의를 사용합니다.
ATTRIBUTES_NEED_TEXCOORD0
VARYINGS_NEED_TEXCOORD0
ATTRIBUTES_NEED
시스템과 VARYINGS_NEED
시스템을 사용하여 Unity가 버텍스와 프래그먼트 셰이더에 보낼 데이터를 결정합니다. ATTRIBUTES_NEED
는 버텍스 데이터를 제어하고 VARYINGS_NEED
는 프래그먼트 데이터를 제어합니다. 다음에 정의된 리스트를 사용하여 이 데이터를 제어할 수 있습니다.
# define ATTRIBUTES_NEED_NORMAL
# define ATTRIBUTES_NEED_TANGENT
# define ATTRIBUTES_NEED_TEXCOORD0
# define ATTRIBUTES_NEED_TEXCOORD1
# define ATTRIBUTES_NEED_TEXCOORD2
# define ATTRIBUTES_NEED_TEXCOORD3
# define ATTRIBUTES_NEED_COLOR
# define VARYINGS_NEED_POSITION_WS
# define VARYINGS_NEED_TANGENT_TO_WORLD
# define VARYINGS_NEED_TEXCOORD0
# define VARYINGS_NEED_TEXCOORD1
# define VARYINGS_NEED_TEXCOORD2
# define VARYINGS_NEED_TEXCOORD3
# define VARYINGS_NEED_COLOR
# define VARYINGS_NEED_CULLFACE
ATTRIBUTES_NEED_TEXCOORD0
과 ATTRIBUTES_NEED_NORMAL
을 사용하여 기본적으로 UV 0과 노멀에 접근할 수 있습니다.
씬에서 렌더러 뎁스 변경
커스텀 패스에 있는 모든 렌더러 컴포넌트의 뎁스 상태를 오버라이드할 수 있습니다. 이는 씬에 렌더링된 게임 오브젝트의 뎁스 상태를 Custom Pass Volume 컴포넌트에 할당된 뎁스 렌더 상태로 교체합니다. 이를 사용하여 씬의 일부 게임 오브젝트를 커스텀 패스에서 보이지 않게 할 수도 있습니다.
또한 이 메서드를 사용하여 카메라 컬링 마스크에 없는 커스텀 패스의 게임 오브젝트를 렌더링할 수 있습니다. Unity는 카메라 컬링 마스크에 없는 불투명 게임 오브젝트를 Equal 뎁스 테스트에서 렌더링합니다. 게임 오브젝트가 뎁스 버퍼에 있는 경우 렌더러의 뎁스 상태만 변경할 수 있습니다. 이러한 불투명 게임 오브젝트를 뎁스 버퍼에 포함하려면 Custom Pass Volume 컴포넌트로 이동하여 Depth Test 프로퍼티를 Less Equal로 설정합니다.
Unity는 포워드 렌더링 경로를 사용하여 커스텀 패스에 모든 오브젝트를 렌더링합니다**.** 이렇게 하면 씬이 Deferred Only를 사용하여 렌더링하도록 설정되어 있는 경우 문제가 발생할 수 있습니다. HDRP 에셋에서 Lit Shader Mode를 Both로 변경하여 프로젝트를 빌드할 때 문제를 방지합니다.
커스텀 버퍼 포맷 사용
커스텀 버퍼를 사용하여 나중에 렌더링 프로세스나 두 개의 커스텀 패스 사이에서 실행할 패스 결과를 저장할 수 있습니다. 모든 종류의 커스텀 패스 셰이더에서 이러한 커스텀 버퍼를 샘플링할 수 있습니다.
드로우 렌더러 커스텀 패스의 경우 Unity는 기본적으로 타겟 버퍼를 카메라 버퍼로 설정하지만 대신 커스텀 버퍼로 선택할 수 있습니다. Custom Buffer Format을 사용하려면 씬에 HDRP 에셋이 필요합니다. HDRP 템플릿 씬을 생성한 경우 Assets > Settings에 HRenderPipelineAsset이라는 이름의 HDRP 에셋이 있습니다. 그렇지 않은 경우 씬에 대한 새로운 HDRP 에셋을 만들려면 HDRP 에셋에 있는 지침을 따릅니다.
HDRP 에셋에 있는 Custom Pass 컴포넌트의 버퍼 포맷을 변경하려면 Rendering > Custom Pass > Custom Buffer Format으로 이동합니다.
HDRP 에셋의 커스텀 패스도 비활성화할 수 있습니다. 이렇게 하려면 Custom Pass 프로퍼티를 비활성화합니다. 이는 자동으로 커스텀 버퍼 할당을 비활성화합니다. 또한 프레임 설정에서 커스텀 패스 렌더링 여부를 선택할 수도 있습니다. 이는 커스텀 버퍼 할당에 영향을 주지 않습니다.