4. Rim Lighting 추가....
Shader"DY/surf_ex_004"{
Properties{
_MainTex("Texture",2D)="white"{}
_BumpMap("Bump Map",2D)="bump"{}
_RimColor("Rim Color",Color)=(0.5,0.5,0.5,0.5)
_RimPower("Rim Power",Range(0.5,8.0))=3.0
}
//프로퍼티에 림컬러와 림파워 추가
SubShader{
Tags{"RanderType"="Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
//인풋에 뷰다이렉션 추가
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
//아웃풋에 림컬러와 파워를 전달하기위해 변수 선언
void surf(Input IN, inout SurfaceOutput o){
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
//정규화한 뷰다이렉션과 노멀의 내적을 구하고 1을 넘지한게 세추레이트 함수를 적용 후 뒤집는다.
//림과 림파와를 파워 함수를 적용하고 림컬러와 합성한다.
o.Emission = _RimColor.rgb*pow(rim,_RimPower);
}
ENDCG
}
Fallback"Diffuse"
}
5.Detail Texture 추가.....
Shader"DY/surf_005"{
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
_Detail ("Detail", 2D) = "gray" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_Detail;
};
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Detail;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;
//Albedo를 추가 해 텍스쳐를 멀티플라이형식으로 합성한다.
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
}
ENDCG
}
Fallback "Diffuse"
}
6. DetailMap screen space...변경 적용
Shader"DY/surf_ex_006"{
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Detail ("Detail", 2D) = "gray" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float4 screenPos;
};
sampler2D _MainTex;
sampler2D _Detail;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
screenUV *= float2(8,6);
//float2에 스크린XY좌표와 W스케일 받아오기
//각각 성분에 8,6 을 곱한값이 screenUV 이다.
o.Albedo *= tex2D (_Detail, screenUV).rgb * 2;
}
ENDCG
}
Fallback "Diffuse"
}
'Unity공부 > Unity Surface Shader 공부' 카테고리의 다른 글
unity surface shader 공부 6 - surface shader custom Light 예제 따라하기 (0) | 2012.08.24 |
---|---|
unity surface shader 공부 5 - surface shader 예제 따라하기 (0) | 2012.08.21 |
unity surface shader 공부 4 - surface shader 예제 따라하기 (0) | 2012.08.20 |
unity surface shader 공부 3 - surface shader 예제 따라하기 (0) | 2012.08.17 |
unity surface shader 공부 1 - surface shader 예제 따라하기 (0) | 2012.07.26 |