Version: 2023.2
언어: 한국어
How Unity loads and uses shaders
컴퓨트 셰이더

런타임 시 셰이더 교체

빌트인 렌더 파이프라인에서 런타임 시 카메라가 일부 지오메트리를 렌더링하는 데 사용하는 셰이더를 변경하도록 지시할 수 있습니다. 이를 수행하여 에지 감지와 같은 시각적 효과를 얻을 수 있습니다.

Shader replacement is done from scripts with either the Camera.RenderWithShader or Camera.SetReplacementShader function. Both functions take a shader and a replacementTag.

It works like this: the camera renders the scene as it normally would. The objects still use their materials, but the shader they use changes:

  • If replacementTag is empty (must be an empty string not null), then all objects in the scene are rendered with the given replacement shader.
  • 만약 replacementTag 가 비어 있지 않으면 렌더될 각 오브젝트에 대해:
    • 실제 오브젝트의 셰이더에 태그 값을 가지고 쿼리합니다.
    • 만약 해당 태그를 가지고 있지 않으면 오브젝트는 렌더링되지 않습니다.
    • 찾은 값의 태그를 가지고 있는 서브셰이더를 대체 셰이더에서 찾습니다. 만약 이러한 서브셰이더가 발견되지 않으면 오브젝트는 렌더링되지 않습니다.
    • 이제 오브젝트 렌더에 서브셰이더를 사용합니다.

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

릿(Lit) 셰이더 대체

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

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

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

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

How Unity loads and uses shaders
컴퓨트 셰이더
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961