
Shader "Holistic/BumpDiffuse"
{
Properties {
_myDiffuse ("Diffuse Textuire", 2D) = "white" {}
_myBump ("Bump Texture", 2D) = "bump" {}
_mySlider ("Bump Amount", Range(0,10)) = 1
_mySlider2 ("Bump Texture Scale", Range(0,10)) = 1
}
SubShader {
CGPROGRAM
#pragma surface surf Lambert
sampler2D _myDiffuse;
sampler2D _myBump;
half _mySlider;
half _mySlider2;
struct Input {
float2 uv_myDiffuse;
float2 uv_myBump;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D(_myDiffuse, IN.uv_myDiffuse).rgb;
o.Normal = UnpackNormal(tex2D(_myBump, IN.uv_myBump * _mySlider2));
o.Normal *= float3(_mySlider, _mySlider, 1);
}
ENDCG
}
Fallback "Diffuse"
}
Illumination Models
전체 흐름
Shader
└── Properties ← 사용자 입력값 정의 (텍스처, 색 등)
└── SubShader ← 실제 쉐이더 코드 블록
└── CGPROGRAM ← HLSL/Cg 코드 작성 공간
└── #pragma surface ← 이 쉐이더의 성격 설정
└── Input / surf() ← 텍스처 샘플링, 표면 정보 결정
└── ENDCG
└── Fallback ← 이 쉐이더가 안 될 때 대체할 것
Surface Shader
surf() 함수만 작성하면 나머지는 Unity가 채워준다.Surface Shader에서 채워야 하는 것들
void surf(Input IN, inout SurfaceOutput o)IN : Unity가 자동으로 채워주는 입력값들 (UV, worldPos 등)o : 직접 설정한 표면 결과 (Albedo, Normal 등)
SubShader
CGPROGRAM ~ ENDCG
CGPROGRAM은 "Cg 언어 프로그램"의 줄임말, 옛날에 쓰던거고, 지금은 HLSL로 컴파일됨.#pragma
surface surf : surf 함수가 이 쉐이더의 surface 함수다Lambert : 조명 모델은 Lambert다surface
Fallback
in : 읽기 전용. 값 받아서 읽기만 가능.out : 쓰기 전용. 함수 내부에서 초기화해서 밖으로 전달.inout : 읽기 + 쓰기. 받아온 값 수정해서 돌려보냄.