티스토리 뷰

Unity/Shader

Shaderlab

연홍 2021. 1. 19. 17:45
728x90

 Unity의 셰이더 파일은 셰이더 속성, 하위 셰이더 및 패스를 정의하기 위해 Shaderlab 구문을 사용하여 작성되며 실제 셰이더 코드는 해당 패스 내에서 HLSL (고수준 셰이딩 언어)로 작성됩니다.

 대부분의 Shaderlab 항목은 내장 된 파이프 라인과 비교하여 변경되지 않았으므로 예제를 제공 할 것입니다. 그러나 세부적으로 설명하는 대신 URP에 계속 적용 할 수있는 Unity 셰이더 문서에 링크 할 것입니다. 유일한 차이점은 URP에 대한 "RenderPipeline"태그와 "LightMode"태그입니다.

 

쉐이더 블록:

Shader "Custom/UnlitShaderExample" {
    ...
}

여기 안에 Properties 블록과 Subshader 블록이 필요합니다 (그리고 Pass 블록 안에).

Properties {
//  [name] ("[name in inspector]", [type]) = [default value]
    _BaseMap ("Base Texture", 2D) = "white" {}
    _BaseColor ("Base Colour", Color) = (0, 0.66, 0.73, 1)
//  _ExampleDir ("Example Vector", Vector) = (0, 1, 0, 0)
//  _ExampleFloat ("Example Float (Vector1)", Float) = 0.5
}

Properties블록은 머티리얼 인스펙터에 노출되어야하는 모든 값을 위한 것입니다. 예를 들어 다른 텍스처/색상을 가진 머티리얼에 동일한 셰이더를 사용할 수 있습니다.

 스크립트에서 값을 제어하려는 경우 (예 : material.SetColor / SetFloat / SetVector 사용) 여기에 속성을 넣을 필요가 없습니다. 그러나 값이 object마다 다를 경우에는 여기에 넣어야합니다. 노출되지 않은 다른 값으로 objet를 일괄 처리하려고하는 SRP Batcher를 사용한 글리치 렌더링. 오브젝트마다 다르지 않으면 Shader.SetGlobalColor / Float / Vector를 대신 사용하는 것이 더 쉽습니다.

SubShader { 
        Tags { "RenderType"="Opaque"
        "Queue"="Geometry"
        "RenderPipeline"="UniversalPipeline" }
         
        HLSLINCLUDE
        ...
        ENDHLSL
         
        Pass {
            Name "ExamplePass"
            Tags { "LightMode"="UniversalForward" }
             
            HLSLPROGRAM
            ...
            ENDHLSL
        }
    }

 Unity는 GPU에서 지원되는 첫 번째 Subshader블록을 사용하며 "RenderPipeline"= "UniversalPipeline"태그로 인해 내장 파이프 라인이나 HDRP에서 실행되지 않고 대신 셰이더에 정의된 다음 서브 셰이더로 시도합니다. 지원되는 하위 셰이더가 없으면 대신 마젠타 오류 셰이더가 표시됩니다.

 참고 : RenderType 태그가 URP에서 중요한지 잘 모르겠습니다. 일반적으로 대체 셰이더를 위해 내장 된 파이프 라인에서 사용됩니다 (유사한 Forward Renderer 기능에 대한 overrideMaterial이 있지만 URP는 지원하지 않음). Queue 태그는 개체가 렌더링되는 순서로, trensparent개체를 스텐실 작업과 함께 정렬하거나 사용하는 방법을 재정의하는 데 주로 유용합니다. 여기에서 이러한 태그에 대한 자세한 정보를 찾을 수 있습니다.

 

 다중 패스 블록은 서브 셰이더에서 정의 할 수 있지만 각각은 특정 LightMode로 태그를 지정해야합니다 (아래 참조). URP는 단일패스포워드렌더러를 사용하므로 첫 번째 "UniversalForward"패스 (GPU에서 지원)만 객체를 렌더링하는 데 사용됩니다. 다중을 가질 수 없으며 둘 다 렌더링 할 수 없습니다. 태그가 지정되지 않은 다른 전달을 가질 수 있지만 SRP Batcher를 사용하면 일괄 처리가 중단됩니다. 대신 별도의 MeshRenderer에서 별도의 셰이더/머티리얼을 사용하거나 Forward Renderer의 Render Objects 기능을 사용하여 overrideMaterial로 특정 레이어의 개체를 다시 렌더링하는 것이 좋습니다.

URP LIGHTMODE TAGS :

UniversalForward – 포워드 렌더러로 개체를 렌더링하는 데 사용됩니다.

ShadowCaster – 그림자 투사에 사용

DepthOnly – 씬 뷰의 깊이 텍스처를 렌더링 할 때 사용되는 것 같지만, 게임 내에서는 사용되지 않는것 같습니다. 일부 렌더러 기능은 이를 사용할 수 있습니다.

Meta – 라이트 맵 베이킹 중에 만 사용.

Universal2D – 포워드 렌더러 대신 2D 렌더러가 활성화 된 경우 사용됩니다.

UniversalGBuffer – 지연된 렌더링과 관련됩니다. 아직 테스트 중이라고 생각됩니다.

 

 또한 패스에 UsePass명령에서 사용되는 "Name"이 지정되었음을 알 수 있습니다. 전체 패스를 작성하는 대신 다른 셰이더의 패스를 사용하는 것이 가능합니다. 이름은 내부적으로 대문자로 변환됩니다. 예를 들어 다른 셰이더에서이 패스를 사용하려면 다음을 수행 할 수 있습니다. UsePass "Custom/UnlitShaderExample/EXAMPLEPASS"

 그러면 해당 패스가 다른 셰이더에 포함됩니다… 그러나 셰이더가 SRP Batcher와 호환 되려면 모든 패스가 동일한 UnityPerMaterial CBUFFER를 공유해야합니다. UsePass를 사용하고 일치하지 않는 경우 문제가됩니다. (적어도 현재 URP 버전에서는 향후 수정 / 변경 될 수 있습니다.) 다음 섹션에서이 CBUFFER가 실제로 무엇인지 살펴 보겠습니다.

 Pass 블록에서는 일반적으로 Cull, ZWrite 및 ZTest를 볼 수 있으며 정의되지 않은 경우 기본적으로 Cull Back, ZWrite On 및 ZTest LEqual로 설정됩니다. Transparent Queue에있는 셰이더의 경우 일반적으로 Blend 작업도 정의해야합니다. 스텐실 작업도 여기서 정의 할 수 있습니다.

 

완전한 Shaderlab은 다음과 같습니다. 다음 섹션에서는 HLSL 부분에 대해 살펴 보겠습니다.

Shader "Custom/UnlitShaderExample" {
    Properties {
        _BaseMap ("Example Texture", 2D) = "white" {}
        _BaseColor ("Example Colour", Color) = (0, 0.66, 0.73, 1)
        //_ExampleDir ("Example Vector", Vector) = (0, 1, 0, 0)
        //_ExampleFloat ("Example Float (Vector1)", Float) = 0.5
    }
    SubShader { 
        Tags { "RenderType"="Opaque"
        "Queue"="Geometry"
        "RenderPipeline"="UniversalPipeline" }
         
        HLSLINCLUDE
        ...
        ENDHLSL
         
        Pass {
            Name "Example"
            Tags { "LightMode"="UniversalForward" }
             
            HLSLPROGRAM
            ...
            ENDHLSL
        }
    }
}

 

'Unity > Shader' 카테고리의 다른 글

Fragment Shader  (0) 2021.01.21
Vertex Shader  (0) 2021.01.21
Post Processing in the Universal RP  (0) 2021.01.20
Structs  (0) 2021.01.20
HLSL  (0) 2021.01.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30