8. CGPROGRAM
#pragma surface surf Lambert
Lambert와 BlinnPhong은 Lighing.cginc 파일에 내장되어 있어 선언만 해주면 되지만 직접 만들경우(Custom
Lighting) 에는 조명 설계를 해주어야 합니다.
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten)
라이트 모델의 포워드 렌더링 패스에서 사용됩니다
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
뷰 방향에 의존하고 있는 라이팅 모델의 포워드 렌더링 패스에서 사용됩니다
자세한 내용은 : http://docs.unity3d.com/kr/current/Manual/SL-SurfaceShaderLighting.html
9. fixed4 LightingUnityLambert (SurfaceOutput s, half3 lightDir, half atten)
{
fixed diff = max (0, dot (s.Normal, light.dir));
fixed4 c;
c.rgb = s.Albedo * light.color * diff;
c.a = s.Alpha;
return c;
}
Lambert Lighting 공식
dot ( a, b ) : a와 b의 내적
max( a, b ) : a와 b의 최대값
10. 요한 하인리히 람베르트(Johann Heinrich Lambert) : 스위스의 수학자, 물리학자, 천문학자, 철학자
램버시안 반사율 : 관찰자가 바라보는 각도와 관계없이 같은 겉보기 밝기를 갖는다. 이를 난반사가 이루어지는 표면을 묘사하기 위해
램버시안 모델을 사용하게 되는데 이는 표면의 특징을 잘 모를때 램버시안 반사는 적당한 근사치가 될 수 있기 때문이다.
12. Unlit Lighting 공식
fixed4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)
{
return fixed4(s.Albedo, 1);
}
Unlit : Unlighting을 준말으로 빛을 계산하지 않는 상태로 많이 표기 된다.}
13.
14. UE4 Nod Unlit 설정. Shading Model에서 Unlit를 설정
Shading Model에서 Unlit로 설정하면
Base color 항목이 비활성되며 Emissive
color 항목만이 활성화 된다.(ambient
source의 영향은 받는 상태)
16. noambient option에 따른 밝기 변화 비교
Unlit 경우처럼 빛을 계산하지 않는 상태에
서도 ambient color에 영향을 받는다.
Light probe를 사용할 경우 이 옵션을 꺼버
리면 아예 빛계산을 못하고 까맣게 나온다.
17. Compiler code
alpha : 알파 블랜딩 타입, 반투명한 셰이더에 사용.
alphatest:VariableName : 알파 테스팅 모드, transparent-cutout 셰이더에 사용. Cutoff 값은 변수 이름에 따름
addshadow : 그림자 생성과 수집 패스를 추가. 절차적인 버텍스 애니메이션이 그림자에 영향을 미치도록 커스텀 버텍스
수정 함수와 함께 사용.
18. Surface는 Shader는 전처리된 코드를 적절히 잘 사용할 수 있는 반면 많은 경우의 수에 대하여 Shader가 컴파일 되므로
Compiler 구문에서 막아서 선언해줘야 한다. 반대로 fragment 구조에서는 필요한 경우에 대해서 Shader에서 계산을 해
줘야 한다.
19. Compiler code
noambient : 앰비언트 라이팅이나 SH라이트가 적용되지 않게 함
novertexlights : 포워드 렌더링에서 SH나 vertex light가 가동되지 않게 함
nolightmap : 셰이더가 라이트맵을 지원하지 않게 만든다
nodirlightmap : directional lightmap을 지원하지 않게 한다
noforwardadd : 포워드 렌더링 가산 패스를 비활성화한다. 그 결과 셰이더는 하나의 디렉셔널 라이트를
완전히 지원하고, 나머지 라이트는 버텍스 단위 또는 SH 방식으로 처리된다. 셰이더를 가볍게 만든다.
approxview : 픽셀이 아니라 버텍스 단위로 단위화된 시선 방향 벡터를 계산한다. 처리가 빨라지지만 카
메라가 오브젝에 근접할 경우 시선방향의 계산이 부정확할 수 있다.
>> Unity 5에서 interpolateview로 변경
halfasview : 시선 방향 대신 하프 디렉션 벡터를 라이팅 함수에 전달한다. 하프 디렉션은 벡터는 버텍스
단위로 연산되고 단위화 된다. 빠르지만 정확도가 떨어진다.