Version: 2021.1
Shader variant collections
컴퓨트 셰이더

Replacing shaders at runtime

In the Built-in Render Pipeline, you can tell a Camera to change the shader that it uses to render certain geometry at runtime. You might do this to achieve a visual effect such as edge detection.

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

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

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

So if all shaders would have, for example, a “RenderType” tag with values like “Opaque”, “Transparent”, “Background”, “Overlay”, you could write a replacement shader that only renders solid objects by using one subshader with RenderType=Solid tag. The other tag types would not be found in the replacement shader, so the objects would be not rendered. Or you could write several subshaders for different “RenderType” tag values. Incidentally, all built-in Shader objects have a “RenderType” tag set.

릿(Lit) 셰이더 대체

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

Shader replacement tags in built-in shaders

All built-in shaders have a “RenderType” tag set that can be used when rendering with replaced shaders. Tag values are the following:

  • Opaque: 대부분의 셰이더입니다(노멀, 자체 조명, 반사, 터레인 셰이더).
  • Transparent: 대부분의 반투명 셰이더입니다(투명, 파티클, 글꼴, 터레인 추가 패스 셰이더).
  • TransparentCutout: 마스크된 투명 셰이더입니다(투명 컷아웃, 2패스 초목 셰이더).
  • Background: 스카이박스 셰이더입니다.
  • Overlay: Halo, Flare shaders.
  • 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”인 셰이더가 있는 모든 오브젝트는 두 번째 대체 서브셰이더를 사용합니다. 대체 셰이더에 있는 지정 키와 일치하는 태그 값이 셰이더에 없는 모든 오브젝트는 렌더링되지 않습니다.

Shader variant collections
컴퓨트 셰이더