http://blog.naver.com/dieofflee/40202035266


 

앞서 유니티에서 적용되는 셰이딩 방식은 3가지라고 언급을 하였습니다.


- 고정 함수 방식 (Fixed Function)

- 정점 프래그 먼트 방식 (Vertex FragMent)

- 서피스 방식 (Surface)


저희는 원하는 셰이더를 자유자제로 만들어야 함으로 고정 함수 방식은 넘어가구요

정점 프래그먼트 방식은 위대한 프로그래머 선배님들이 써 놓은 좋은 책들이 많습니다

Surface 방식은 유니티에서 쉽고 강력한 기능을 제공하기 때문에 저 같은 초보자가 쉽게 할 수 있다는 장점이 있어서 Surface방식을 파볼려고 합니다

(고정 함수 방식도 나중에 정리 하겠습니다.)


먼저 가장 기본적인 형태를 볼까요


SubShader {
     Tags { "RenderType" = "Opaque" }
     CGPROGRAM
     
#pragma surface surf Lambert
     struct Input {
         float4 color : COLOR;
     };
     void surf (Input IN, inout SurfaceOutput o) {
         o.Albedo = 1;
     }
     ENDCG
   }
   Fallback "Diffuse"

}


위의 #pragma 가 보이시나요?

그리고 그 위에 CGPROGRAM이 보이시나요?

CGPROGRAM은 ENDCG와 짝을 이루며 이 안에 포함된 것은 #pragama의 방식으로 렌더링 되게 됩니다


#pragma 지시자는 Surface쉐이더가 어떤 형식인지 지시하는 지시자입니다

기본적인 구조는


#pragma surface surfaceFunction lightModel [optionalparams]


로 되어있고 SurfaceFunction은 표면 쉐이더 코드가 있는 Cg함수 입니다

void surf (Input IN, inout SurfaceOutput o)

{
         o.Albedo = 1;
}

예제에서 보이는 이 부분이죠

형태는 기본적으로 이런 형식을 가지고 있고 Input은 텟트쳐 좌표와 표면 함수에 필요한 자동 생성된 변수가 들어 있는 구조체 입니다


lightModel은 셰이더가 사용하는 라이팅 모델입니다

Lambert(디퓨즈)와BlinnPhong(스펙큘러)이 내장되어 있습니다

lightModel은 다양하게 있는데 이 커스텀라이팅 모델을 이용해서 자신만의 라이팅 모델을 만들 수 있습니다

이것은 Unity안에 Lighting.cfinc파일에서 정의도어 있고 Cg/HLSL의 함수보다 많지는 않습니다


1. half4 LightingName(SurfaceOutput s, half3 lightDir, half atten)

; 이것은 뷰 디렉션에 의존하지 않는 포워드 렌더링 경로에서 사용됩니다 (예. diffuse).


2. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)

; 이것은 뷰 디렉션에 의존하는 조명 모델을 위한 포워드 렌더링 경로에서 사용됩니다


3. half4 LightingName_PrePass (SurfaceOutput s, half4 light)

; 이것은 deferred 조명 경로에서 사용됩니다.


굳이 다 선언할 필요가 없으므로 사용하지 않는다면 정의하거나 선언할 필요는 없습니다



마지막으로 선택적 파라미터입니다[optionalparams]



타입

설명

alpha

알파 블랜딩 타입, 반투명한 셰이더에 사용한다.

alphatest:VariableName

알파 테스팅 방식, transparent-cutout 셰이더에 사용한다. Cutoff 값은 플룻 타입 변수다

vertex:VertexFunction

커스텀 버텍스 수정 함수다. Tree Bark 셰이더를 참조한다.

exclude_path:prepass

또는 exclude_path:forward

특정 렌더링 방식을 위한 패스를 생성하지 않는다.

addshadow

그림자 생성과 수집 패스를 추가한다. 절차적인 버텍스 애니메이션이 그림자에 영향을 미치도록 커스텀 버텍스 수정 함수와 함께 사용한다.

dualforward

포워드 방식에 듀얼 라이트맵을 사용한다.

fullforwardshadows

포워드 랜더링 방식에서 모든 그림자 유형을 지원한다.

decal:add

가산 방식의 데칼 셰이더

decal:blend

반투명한 데칼 셰이더

softvegetation

Soft Vegetation 옵션을 사용할 경우에만 표면 셰이더가 렌더링 되게 한다.

Noambient

앰비언트 라이팅이나 구면 조화 함수를 적용하지 않는다.

novertexlights

포워드 렌더링에서 구면 조화 함수나 버텍스 라이팅을 적용하지 않는다.

nolightmap

셰이더가 라이트맵을 지원하지 않게 만든다

Noforwardadd

포워드 렌더링 가산 패스를 비활성화한다. 그 결과 셰이더는 하나의 디렉셔널 라이트를 완전히 지원하고, 나머지 라이트는 버텍스 단위 또는 SH 방식으로 처리된다. 셰이더를 가볍게 만든다.

approxview

픽셀이 아니라 버텍스 단위로 단위화된 시선 방향 벡터를 계산한다. 처리가 빨라지지만 카메라가 오브젝에 근접할 경우 시선방향의 계산이 부정확할 수 있다.

halfasview

시선 방향 대신 하프 디렉션 벡터를 라이팅 함수에 전달한다. 하프 디렉션은 벡터는 버텍스 단위로 연산되고 단위화 된다. 빠르지만 정확도가 떨어진다.

 

 

 

 

 

+ Recent posts