낮은 레벨의 Vertex/Pixel Shader Programs 보다 조명 쉐이더를 쉽게 만드는 코드를 생성해 줌
유니티에서 제공되고 있는 내장된 조명 모델(Lighting Model)은 "Lambert(Diffuse조명)과 BlinnPhong(반사적인 조명)" 이 있음
내장된 Lmabert와 BlinnPhong 모델은 {unity install paht}/Data/CGIncludes/Lighting.cginc 안에 정의되어 있음
사용자 정의 라이트(Cutom Lighting models in Surface Shaders)의 생성도 가능함
[ Writing Suface Shaders ] - Unity 공식 사이트
Writing Surface Shaders for Unity 3D [ 유투브 동영상]
[ 기본적인 Surface Shader 코드 ]
Shader "Example/Diffuse Simple" {
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"
}
CGPROGRAM ~ ENDC : 연산을 위한 쉐이더 코드는 이 사이에 있어야 함
#pragma surface surfaceFunction lightModel [optionalparams]
surface Shader임을 알리기 위해 #pragma surface 지시어를 사용
surfaceFunction : Surface Shader 코드를 가지는 함수
void surf (Input IN, inout SurfaceOutput o)의 형태
Input IN : 사용자가 정의한 형태
lightModel : 사용하는 조명 모델 / 내장된 것들은 Lambert와 BlinnPhong이 있으며, 사용자가 정의하는 방법으로 Custom Lighting Model을 생성할 수 있음
optionalparams : 천천히...
#pragma debug : ? 어떤걸 볼 수 있을 까?
struct Input {}에 들어갈 수 있는 값들
float3 viewDir - Parallax Effects, rim righting 등을 계산해 내기 위해 "뷰 디렉션"을 포함함
float4 with COLOR semantic - 보간되는 정점당 색상을 포함할 것입니다.
float4 screenPos - 반사 효과를 위해서 스크린 공간 위치를 포함함.
float3 worldPos - 월드 공간 위치를 포함함
float3 worldRefl - SurfaceShader가 o.Normal에 값을 부여하지 못한다면 월드 반사 벡터를 포함함. 샘플 코드 Reflect-Diffuse를 살펴보시기 바랍니다.
float3 worldNormal - SurfaceShader가 o.Normal로 쓰여지지 않는다면 World normal 벡터를 포함함
float3 worldRefl; INTERNAL_DATA - 표면 쉐이더가o.Normal로 쓰여진다면 세계 반사 벡터를 포함할 것입니다. 픽셀당 normal map에 기반한 반사 벡터를 얻기 위해서 WorldReflectionVector (IN, o.Normal)을 사용하시기 바랍니다. 예를 위해서Reflect-Bumped를 참고하시기 바랍니다.
float3 worldNormal; INTERNAL_DATA - 표면 쉐이더가o.Normal로 쓰여진다면 세계 normal 벡터를 포함할 것입니다. 픽셀당 normal map에 기반한 반사 벡터를 얻기 위해서 WorldNormalVector (IN, o.Normal)을 사용하시기 바랍니다(IN, o.Normal)..
struct SurfaceOutput {
half3 Albedo; // 색상
half3 Normal; //
half3 Emission; // 발산
half Specular; // 반사
half Gloss; // Specular의 퍼짐 정도
half Alpha; // 투명도(Opacity)
};
[ Surface Shader Lighting Examples ]
http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderLightingExamples.html
http://www.unitykoreawiki.com/index.php?n=KrMain.SL-SurfaceShaderExamples
Diffuse
[ 용어 정리 ]
half : float의 자료형인 경우 32비트 부동 소수점으로 표현되지만, half는 16비트 부동 소수점으로 표현됨(color나 nomalize 된 결과에는 정밀도 손실없이 충분함)