셰이더 작성 시 성능 팁
사용자 셰이더 GUI

대체 셰이더로 렌더링

일부 렌더링 효과를 위해 다른 셰이더로 씬을 렌더링해야 하는 경우가 있습니다. 예를 들어, 에지 감지를 제대로 하려면 표면 방향 차이를 감지할 수 있도록 씬 노멀이 있는 텍스처가 필요합니다. 다른 효과에서는 씬 뎁스가 있는 텍스처가 필요할 수도 있습니다. 이를 위해 씬을 모든 오브젝트의 대체 셰이더로 렌더링할 수 있습니다.

셰이더 대체는 스크립트에서 Camera.RenderWithShader 또는 Camera.SetReplacementShader 함수를 사용합니다. 두 함수 모두 shaderreplacementTag 를 받습니다.

동작 방식은 다음과 같습니다. 카메라가 평상시처럼 씬을 렌더링합니다. 오브젝트는 여전히 각자의 머티리얼을 사용하지만 사용되는 실제 셰이더는 변경됩니다.

  • 만약 replacementTag 가 비어 있으면 씬의 모든 오브젝트는 주어진 대체 셰이더로 렌더링됩니다.
  • 만약 replacementTag 가 비어 있지 않으면 렌더될 각 오브젝트에 대해:
    • 실제 오브젝트의 셰이더에 태그 값을 가지고 쿼리합니다.
    • 만약 해당 태그를 가지고 있지 않으면 오브젝트는 렌더링되지 않습니다.
    • 찾은 값의 태그를 가지고 있는 서브셰이더를 대체 셰이더에서 찾습니다. 만약 이러한 서브셰이더가 발견되지 않으면 오브젝트는 렌더링되지 않습니다.
    • 이제 오브젝트 렌더에 서브셰이더를 사용합니다.

따라서 만약 모든 셰이더가 “Opaque”, “Transparent”, “Background”, “Overlay”와 같은 값의 “RenderType” 태그를 가진다면 RenderType=Solid 태그를 갖는 서브셰이더를 사용하여 솔리드 오브젝트만을 렌더링하는 대체 셰이더를 작성할 수 있습니다. 다른 태그 타입은 대체 셰이더에서 발견되지 않으므로 오브젝트는 렌더링되지 않습니다. 또는 다른 “RenderType” 태그값용으로 여러 서브셰이더를 작성할 수도 있습니다. 덧붙이자면 모든 Unity 빌트인 셰이더는 “RenderType” 태그 집합을 가지고 있습니다.

릿(Lit) 셰이더 대체

셰이더 대체를 사용하면 씬은 카메라에 설정된 렌더 경로를 사용하여 렌더링됩니다. 즉 대체용으로 사용된 셰이더는 그림자 및 조명 패스를 포함할 수 있다는 것을 의미합니다(표면 셰이더를 셰이더 대체로 사용 가능). 이는 특수 효과 렌더링이나 씬 디버깅에 유용합니다.

Unity 빌트인 셰이더의 셰이더 대체 태그

모든 Unity 빌트인 셰이더는 “RenderType” 태그 집합을 가지고 있으며 대체 셰이더로 렌더링할 때 사용할 수 있습니다. 태그값은 다음과 같습니다.

  • Opaque: 대부분의 셰이더입니다(노멀, 자체 조명, 반사, 터레인 셰이더).
  • Transparent: 대부분의 반투명 셰이더입니다(투명, 파티클, 글꼴, 터레인 추가 패스 셰이더).
  • TransparentCutout: 마스크된 투명 셰이더입니다(투명 컷아웃, 2패스 초목 셰이더).
  • Background: 스카이박스 셰이더입니다.
  • Overlay: GUITexture, 후광, 플레어 셰이더입니다.
  • TreeOpaque: 터레인 엔진 나무껍질입니다.
  • TreeTransparentCutout: 터레인 엔진 나뭇잎입니다.
  • TreeBillboard: 터레인 엔진 빌보드 나무입니다.
  • Grass: 터레인 엔진 잔디입니다.
  • GrassBillboard: 터레인 엔진 빌보드 잔디입니다.

빌트인 씬 뎁스/노멀 텍스처

카메라에는 일부 효과에서 필요로 할 경우 뎁스 또는 뎁스+노멀 텍스처를 렌더할 수 있는 기능이 빌트인돼 있습니다. 카메라 뎁스 텍스처를 참조하십시오. 일부 경우(하드웨어에 따라) 뎁스 및 뎁스+노멀 텍스처는 내부적으로 셰이더 대체를 사용하여 렌더링될 수 있다는 점을 참조하십시오. 따라서 셰이더에 정확한 “RenderType” 태그를 포함시키는 것이 중요합니다.

코드 예제

Start() 함수는 대체 셰이더를 지정합니다.

void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

이렇게 하면 EffectShader가 RenderType 키를 사용하도록 요청합니다. EffectShader는 원하는 각 RenderType에 대해 키값 태그를 갖게 됩니다. 이 셰이더는 다음과 같습니다.

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

SetReplacementShader가 씬에 있는 모든 오브젝트를 검토하며 노멀 셰이더를 사용하는 대신 지정 키와 값이 일치하는 첫 번째 서브셰이더를 사용합니다. 이 예제에서는 셰이더에 Rendertype=“Opaque” 태그가 있는 모든 오브젝트는 EffectShader에 있는 첫 번째 서브셰이더로 대체되며 RenderType=“SomethingElse”인 셰이더가 있는 모든 오브젝트는 두 번째 대체 서브셰이더를 사용합니다. 대체 셰이더에 있는 지정 키와 일치하는 태그 값이 셰이더에 없는 모든 오브젝트는 렌더링되지 않습니다.

셰이더 작성 시 성능 팁
사용자 셰이더 GUI