쉐이더 레퍼런스
표면 쉐이더의 예

서피스 쉐이더 작성

라이팅과 상호 작용하는 쉐이더 기술은 복잡합니다. 각종 라이트, 각종 그림자 옵션, 각종 렌더링 패스(포워드 및 지연 렌더링)가 있으며, 쉐이더는 그 복잡성을 처리해야 합니다.

Unity의 Surface Shaders는 낮은 수준의 vertex/pixel shader programs를 사용한 경우보다 lit 쉐이더 기술을, 코드 생성으로 훨씬 간단하게 하는 방법입니다. Surface Shaders에는 사용자 언어, 마법, 닌자도 없습니다; 수동으로 작성해야 하는 반복 코드를 모두 생성하고 있을 뿐입니다. 여전히 Cg/HLSL로 쉐이더 코드를 작성합니다.

샘플이 필요한 경우 Surface Shader Examples and Surface Shader Custom Lighting Examples를 참조하십시오.

작동 방법

우선 입력을 위한 UV 및 기타 필요한 데이터와 출력 구조 SurfaceOutput이 기술되어 있는 surface function 을 정의합니다. SurfaceOutput는 기본적으로 표면의 프로퍼티 를 기술합니다(albedo color, normal, emission, specularity etc.). Cg/HLSL에서 이 코드를 작성합니다.

Surface Shaders 컴파일러는 어떤 입력이 필요하고, 어떤 출력을 내는가에 대한 것을 결정하고, vertex&pixel shaders를 생성합니다. 물론 Forward 렌더링 및 Deferred 렌더링을 처리하는 렌더링 패스도 여기서 생성합니다.

Surface Shaders가 출력하는 표준 구조는 다음과 같습니다.

struct SurfaceOutput
{
    fixed3 Albedo;  // diffuse color
    fixed3 Normal;  // tangent space normal, if written
    fixed3 Emission;
    half Specular;  // specular power in 0..1 range
    fixed Gloss;    // specular intensity
    fixed Alpha;    // alpha for transparencies
};

In Unity 5, surface shaders can also use physically based lighting models. Built-in Standard and StandardSpecular lighting models (see below) use these output structures respectively:

struct SurfaceOutputStandard
{
    fixed3 Albedo;      // base (diffuse or specular) color
    fixed3 Normal;      // tangent space normal, if written
    half3 Emission;
    half Metallic;      // 0=non-metal, 1=metal
    half Smoothness;    // 0=rough, 1=smooth
    half Occlusion;     // occlusion (default 1)
    fixed Alpha;        // alpha for transparencies
};
struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;      // diffuse color
    fixed3 Specular;    // specular color
    fixed3 Normal;      // tangent space normal, if written
    half3 Emission;
    half Smoothness;    // 0=rough, 1=smooth
    half Occlusion;     // occlusion (default 1)
    fixed Alpha;        // alpha for transparencies
};

샘플

Surface Shader Examples, Surface Shader Custom Lighting Examples and Surface Shader Tessellation 페이지를 참조하십시오.

Surface Shaders 컴파일 명령

기타 쉐이더와 마찬가지로, Surface Shaders는 CGPROGRAM..ENDCG 블록 내에 배치됩니다. 차이점은 다음과 같습니다.

  • Pass 대신 SubShader 블록에 배치되어야 합니다. Surface Shaders는 여러 패스로 컴파일됩니다.
  • #pragma surface ... 명령을 사용하여 이것이 Surface Shaders임을 보여줍니다.

#pragma surface 명령은 다음과 같습니다.

#pragma surface surfaceFunction lightModel [optionalparams]
  • surfaceFunction - Cg로 작성된 Surface Shaders의 함수입니다. 그것은void surf(Input IN, inout SurfaceOutput o)라는 함수를 가지는 것을 의미합니다. 여기에서 Input은 미리 정의한 구조체입니다. Input은 surface 함수가 필요로 하는 텍스처 좌표와 추가 자동 변수를 포함해야 합니다.
  • lightModel - 사용하는 라이팅 모델. 내장 라이팅 모델은 심플한 비-물리기반의Lambert(diffuse)와 BlinnPhong(specular)뿐만 아니라 물리기반인 StandardStandardSpecular가 있습니다. 직접 설정한 라이팅 모델을 작성하는 방법에 관해서는, Custom Lighting Models 페이지를 참조하십시오.
    • Standard lighting model uses SurfaceOutputStandard output struct, and matches the Standard (metallic workflow) shader in Unity.
    • StandardSpecular lighting model uses SurfaceOutputStandardSpecular output struct, and matches the Standard (specular setup) shader in Unity.
    • Lambert and BlinnPhong lighting models are not physically based (coming from Unity 4.x), but the shaders using them can be faster to render on low-end hardware.

옵션 파라미터:

Transparency and alpha testing is controlled by alpha and alphatest directives. Transparency can typically be of two kinds: traditional alpha blending (used for fading objects out) or more physically plausible “premultiplied blending” (which allows semitransparent surfaces to retain proper specular reflections). Enabling semitransparency makes the generated surface shader code contain blending commands; whereas enabling alpha cutout will do a fragment discard in the generated pixel shader, based on the given variable.

  • alpha or alpha:auto - Will pick fade-transparency (same as alpha:fade) for simple lighting functions, and premultiplied transparency (same as alpha:premul) for physically based lighting functions.
  • alpha:blend - Enable alpha blending.
  • alpha:fade - Enable traditional fade-transparency.
  • alpha:premul - Enable premultiplied alpha transparency.
  • alphatest:VariableName - Enable alpha cutout transparency. Cutoff value is in a float variable with VariableName. You’ll likely also want to use addshadow directive to generate proper shadow caster pass.
  • keepalpha - By default opaque surface shaders write 1.0 (white) into alpha channel, no matter what’s output in the Alpha of output struct or what’s returned by the lighting function. Using this option allows keeping lighting function’s alpha value even for opaque surface shaders.
  • decal:add - Additive decal shader (e.g. terrain AddPass). This is meant for objects that lie atop of other surfaces, and use additive blending. See Surface Shader Examples
  • decal:blend - Semitransparent decal shader. This is meant for objects that lie atop of other surfaces, and use alpha blending. See Surface Shader Examples

Custom modifier functions can be used to alter or compute incoming vertex data, or to alter final computed fragment color.

  • vertex:VertexFunction - Custom vertex modification function. This function is invoked at start of generated vertex shader, and can modify or compute per-vertex data. See Surface Shader Examples.
  • finalcolor:ColorFunction - 사용자 정의의 최종 색상 수정자. 자세한 내용은 Surface Shader Examples을 참조하십시오.
  • finalgbuffer:ColorFunction - Custom deferred path for altering gbuffer content.
  • finalprepass:ColorFunction - Custom prepass base path.

Shadows and Tessellation - additional directives can be given to control how shadows and tessellation is handled.

  • addshadow - 그림자 캐스터 패스를 추가합니다. 일반적으로 사용자 정의 정점 편집에 사용되므로 그림자 캐스팅도 절차적 정점 애니메이션을 가져옵니다. 단지 fallback으로부터 그림자 캐스터 패스를 사용하는 것이므로 어떤 특별한 그림자 다루는 것이 자주 필요하진 않습니다.
  • fullforwardshadows - Support all light shadow types in Forward rendering path. By default shaders only support shadows from one directional light in forward rendering (to save on internal shader variant count). If you need point or spot light shadows in forward rendering, use this directive.
  • tessellate:TessFunction - DX11 GPU 테셀레이션을 사용합니다. 자세한 내용은 Surface Shader Tessellation을 참조하십시오.

Code generation options - by default generated surface shader code tries to handle all possible lighting/shadowing/lightmap scenarios. However in some cases you know you won’t need some of them, and it is possible to adjust generated code to skip them. This can result in smaller shaders that are faster to load.

  • exclude_path:deferred, exclude_path:forward, exclude_path:prepass - Do not generate passes for given rendering path (Deferred Shading, Forward and Legacy Deferred respectively). *noshadow - 이 쉐이더에서 모든 그림자 리시빙(shadow receiving) 지원을 비활성화합니다.
  • noambient - 앰비언트 라이팅 또는 라이트 프로브를 적용하지 않습니다.
  • novertexlights - Forward 렌더링에서 라이트 프로브 또는 정점 당 라이트를 적용하지 않습니다.
  • nolightmap - 이 쉐이더에서 모든 라이트맵 지원을 비활성화합니다.
  • nodirlightmap - 이 쉐이더에서 실시간 동적 전역 조명(runtime dynamic global illumination) 지원을 비활성화합니다.
  • nodirlightmap - 이 쉐이더에서 디렉셔널 라이트맵 지원을 비활성화합니다.
  • nofog - Disables all built-in Fog support.
  • nometa - Does not generate a “meta” pass (that’s used by lightmapping & dynamic global illumination to extract surface information).
  • noforwardadd - Forward 렌더링 추가 패스를 비활성화합니다. 그러면 쉐이더는 전체적인 디렉셔널 라이트 지원하고, 다른 모든 라이트는 정점 당/SH 계산됩니다. 쉐이더도 더 작아집니다.

Miscellaneous options

  • softvegetation - Soft Vegetation을 선택하면, Surface Shaders 만 렌더링하도록 합니다.
  • interpolateview - Compute view direction in the vertex shader and interpolate it; instead of computing it in the pixel shader. This can make the pixel shader faster, but uses up one more texture interpolator.
  • halfasview - half-direction 벡터를 뷰 방향이 아닌 라이팅 함수에 전달합니다. Half-direction은 정점마다 계산 및 정규화됩니다. 이것은 더 빠르지만 전체적으로 정확하지 않습니다.
  • approxview - Removed in Unity 5.0. Use interpolateview instead.
  • dualforward - forward에서 dual lightmaps를 사용합니다.

To see what exactly is different from using different options above, it can be helpful to use “Show Generated Code” button in the Shader Inspector.

서피스 쉐이더 인풋 구조

입력 구조체 Input에는 일반적으로 쉐이더에 의해 요구되는 텍스처 좌표가 있습니다. 텍스처 좌표의 이름은 uv 뒤에 텍스처 이름이 오는 형태로 해야 합니다(두번째 텍스처 좌표 세트를 사용하려면 uv2로 시작)

다음 값을 입력 구조에 입력할 수 있습니다.

  • float3 viewDir - 뷰 방향을 포함합니다. 시차 효과, 림 라이팅 등의 계산에 사용됩니다. *float4 withCOLOR 의미 - 보간된 정점 당 색상을 포함합니다.
  • float4 screenPos - 반사 효과의 스크린스페이스 위치 또는 스크린스페이스 효과를 포함합니다.
  • float3 worldPos - 월드 공간상의 위치를 ​​포함합니다.
  • float3 worldRefl - Surface Shaders이 o.Normal에 기입하지 않는 경우 월드 반사 벡터를 포함합니다. 반사 - 디퓨즈 쉐이더를 참조하십시오.
  • float3 worldNormal - Surface Shaders이 o.Normal에 기입하지 않는 경우 월드 법선 벡터를 포함합니다.
  • float3 worldRefl; INTERNAL_DATA - Surface Shaders이 o.Normal에 쓸 경우 월드 반사 벡터를 포함합니다. 픽셀 당 법선 맵에 기초하여, 반사 벡터를 얻으려면 WorldReflectionVector(IN, o.Normal)를 사용합니다. 반사-범프 형 쉐이더(Reflect-Bumped shader)를 참조하십시오.
  • float3 worldNormal; INTERNAL_DATA - _Surface Shaders가 o.Normal에 쓰는 경우 _ 월드 반사 벡터를 포함합니다. 픽셀 당 법선맵에 기초하며, 법선 벡터를 얻으려면 WorldNormalVector (IN, o.Normal)를 사용합니다.

서피스 쉐이더와 DirectX 11

현재 표면 쉐이더의 일부 컴파일 파이프 라인은 DirectX 11 특유의 HLSL 문법을 해석할 수 없기 때문에 만약 StructuredBuffers, RWTextures 및 기타 비 DX9 문법 같은 HLSL 기능을 사용하는 경우는 DX11 전용 처리기 매크로로 래핑해야 합니다. 자세한 내용은 플랫폼 고유의 차이를 참조하십시오.

See Platform Specific Differences and Shading Language pages for details.

필요한 파라미터:

쉐이더 레퍼런스
표면 쉐이더의 예