쉐이더 작성시 퍼포먼스 팁
Custom Shader GUI

Replaced Shaders에서의 렌더링

일부 렌더링 효과는 다른 세트의 쉐이더를 사용하여 씬을 렌더링해야 합니다. 예를 들어, 뛰어난 엣지 검출에는, 표면의 차이가 다른 엣지를 검출하기 위해, 씬에 법선이 있는 텍스처가 필요합니다. 다른 효과에서도 씬에 깊이가 있는 텍스처가 필요하기도 합니다. 이것을 달성하기 위해 씬을 모든 오브젝트를 Replaced 쉐이더로 렌더링 할 수 있습니다.

쉐이더 replacement를 스크립팅으로 수행하기 위해서는 Camera.RenderWithShader 또는 Camera.SetReplacementShader 함수를 사용합니다. 두 함수는 shaderreplacementTag를 사용합니다.

다음과 같이 작동합니다 : 카메라는 씬을 평소대로 렌더링합니다. 오브젝트는 메테리얼을 사용하지만, 실제로 사용되는 쉐이더가 변경됩니다 :

  • replacementTag가 비어 있으면, 씬의 모든 오브젝트는 지정된 Replaced Shader에서 렌더링됩니다.
  • replacementTag가 비어 있지 않은 경우, 렌더링 된 각 오브젝트에 대해 :
    • The real object’s shader is queried for the tag value.
    • If it does not have that tag, object is not rendered.
    • A subshader is found in the replacement shader that has a given tag with the found value. If no such subshader is found, object is not rendered.
    • Now that subshader is used to render the object.

만약 모든 쉐이더가 예를 들어, “RenderType” 태그 값에 “Opaque”, “Transparent”, “Background”, “Overlay”가 있었을 경우, 불투명한 오브젝트만 렌더링하는 Replacement Shader를 RenderType=Solid tag인 하나의 서브 쉐이더를 사용하여 설명할 수 있습니다. 다른 태그의 유형은 Replacement Shader에서 찾을 수 없기 때문에, 오브젝트는 렌더링되지 않습니다. 또는 복수의 서브 쉐이더를 다른 “RenderType”의 태그 값을 위해, 기술할 수 있습니다. 공교롭게도 모든 Unity 내장 쉐이더는 “RenderType” 태그 세트를 가지고 있습니다.

Lit shader replacement

Shader Replacement를 사용하면 씬은 카메라에 설정된 렌더링 패스를 사용하여 렌더링됩니다. 즉, Replacement에 사용되는 쉐이더는 그림자 및 라이팅 패스를 포함할 수 있다는 것입니다(표면 쉐이더를 Shader Replacement에 사용할 수 있습니다). 이것은 특수 효과의 렌더링 및 씬의 디버깅에 유용합니다.

Unity 내장 쉐이더에서의 Replacement Shader 태그

모든 Unity 내장 쉐이더는 “RenderType” 태그 세트를 가지고 Replaced Shader에서 사용할 수 있습니다. 태그의 값은 다음과 같습니다 :

  • Opaque: 대부분의 쉐이더 (Normal](shader-NormalFamily.html), Self Illuminated, Reflective, Terrain 쉐이더).
  • Transparent: 대부분의 부분적으로 투명한 쉐이더(Transparent, 파티클, 글꼴, Terrain 추가 패스 쉐이더).
  • TransparentCutout: 마스킹 된 투명 쉐이더(Transparent Cutout, 2 패스 식물 쉐이더).
  • Background: Skybox 쉐이더.
  • Overlay: GUITexture, 후광(Halo), 플레어 쉐이더(Flare shaders).
  • TreeOpaque: Terrain 엔진 나무 껍질.
  • TreeTransparentCutout: Terrain 엔진 나뭇잎.
  • TreeBillboard: Terrain 엔진 빌보드 Tree.
  • Grass: terrain 엔진의 grass.
  • GrassBillboard: Terrain 엔진 빌보드 Grass.

내장 씬 깊이/법선 텍스처

카메라에는 내부에서, 어떤 효과에서 필요한 경우에, 텍스처의 깊이 또는 깊이 + 법선을 렌더링하는 기능이 있습니다. Camera Depth Texture를 참조하십시오. 어떤 경우(하드웨어에 따라), 텍스처의 깊이 또는 깊이 + 법선은 내부적으로 Replacement Shader에서 렌더링 할 수 있는 점에 유의하십시오. 따라서 쉐이더 올바른 “RenderType” 태그가 있는 것이 중요합니다.

Code Example

Your Start() function specifies the replacement shaders:

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

This requests that the EffectShader will use the RenderType key. The EffectShader will have key-value tags for each RenderType that you want. The Shader will look something like:

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

SetReplacementShader will look through all the objects in the scene and, instead of using their normal shader, use the first subshader which has a matching value for the specified key. In this example, any objects whose shader has Rendertype=“Opaque” tag will be replaced by first subshader in EffectShader, any objects with RenderType=“SomethingElse” shader will use second replacement subshader and so one. Any objects whose shader does not have a matching tag value for the specified key in the replacement shader will not be rendered.

쉐이더 작성시 퍼포먼스 팁
Custom Shader GUI