목차

,

Writing Surface Shaders

조명과 상호작용하는 쉐이더를 쓰는 것은 복잡합니다. 다른 조명 타입과 그림자 옵션, 렌더링 경로 (포워드 그리고 지연 렌더링)이 있고 쉐이더는 모든 복잡성을 다뤄야만 합니다.

Unity에서 Surface Shaders는 낮은 레벨의 vertex/pixel shader programs을 사용하는 것 보다 조명 쉐이더를 쓰는 것을 더욱 쉽게 만드는 코드 생성 방법입니다. 표면 쉐이더에 연관된 사용자 정의 언어, 마술 또는 닌자가 없다는 것을 참고하세요; 그것은 단지 손으로 쓰여져야하는 모든 반복적인 코드를 생성합니다. 사용자는 여전히Cg / HLSL로 쉐이더 코드를 씁니다.

예를 위해서 ''Surface Shader Examples''''Surface Shader Custom Lighting Examples''를 살펴보시기 바랍니다.

How it works

사용자는 사용자가 입력값으로 필요로 하는 어떠한UVs 또는 데이터를 취하는 "surface function"을 정의하고 결과 구조 SurfaceOutput를 채웁니다. SurfaceOutput은 기본적으로 표면의 속성을 설명합니다 (그것은albedo 색상, normal, 발산, 반사 등). 사용자는Cg / HLSL로 이 코드를 씁니다.

표면 쉐이더 컴파일러는 그 때 어떤 입력값이 필요되어 지는지, 무슨 결과가 채워지는 지 등을 알아내고 포워드 그리고 지연 렌더링을 처리하기 위해 패스들을 렌더링할 뿐만 아니라 실제 vertex&pixel shaders를 생성합니다.

표면 쉐이더의 기본적인 결과 구조는 이것입니다:

struct SurfaceOutput {
    half3 Albedo;
    half3 Normal;
    half3 Emission;
    half Specular;
    half Gloss;
    half Alpha;
};

Samples

''Surface Shader Examples''''Surface Shader Custom Lighting Examples'' 페이지를 살펴보시기 바랍니다.

Surface Shader compile directives

표면 쉐이더는 다른 쉐이더들 처럼 CGPROGRAM..ENDCG 블록 사이에 놓여집니다. 차이는 이것입니다:

그것은 그것이 표면 쉐이더라는 것을 알리기 위해 #pragma surface 지시어를 사용합니다:

  #pragma surface _surfaceFunction_ _lightModel_ //[optionalparams]//

Required parameters:

Optional parameters:

또한 사용자는CGPROGRAM 블록 안에서 #pragma debug 를 쓸 수 있고 그 후에 표면 컴파일러는 생성된 코드의 많은 코멘트들을 나눌 것입니다. 사용자는 쉐이더 인스펙터에서Open Compiled Shader을 사용하는 것을 볼 수 있습니다.

Surface Shader input structure

입력 구조 Input은 일반적으로 쉐이더에 의해 필요되어지는 어떠한 텍스쳐 좌표라도 가집니다. 텍스쳐 좌표는 텍스쳐 이름 다음에 "uv"라고 이름지어져야만 합니다.

입력 구조에 끼워 넣을 수 있는 추가적인 값들:

Further Documentation

(:tocportion:)