반응형
기존에 했던(블린퐁에서 스펙큘러 만들기)걸 재사용해서
LightingTest 부분만 수정할 것이다.
---
디퓨즈 컬러 만들기
//램버트 적용
float3 diffColor;
float ndotl = dot(s.Normal, lightDir);
diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;
디퓨즈 (빛 정보 감쇠까지 가지는 컬러를 만들어준다.)
스펙큘러 적용된 컬러 만들기
//스펙큘러 적용
float3 specColor;
float3 H = normalize(viewDir + lightDir);
float spec = dot(H,s.Normal);
specColor = spec * _SpecCol.rgb;
림 컬러 적용
//Rim 적용
float3 rimColor;
float rim = dot(viewDir, s.Normal);
float invertRim = 1 - rim;
rimColor = invertRim;
----
위에 세가지 컬러를 이제 섞어서 출력하면 된다.
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpMap ("NormalMap", 2D) = "bump" {}
_SpecPow ("Specular Power", Float) = 50.0
_SpecCol ("specular Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf _Test noambient
sampler2D _MainTex;
sampler2D _BumpMap;
float _SpecPow;
float4 _SpecCol;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
o.Alpha = c.a;
}
float4 Lighting_Test (SurfaceOutput s, float3 lightDir, float viewDir, float atten){
float4 final;
//램버트 적용
float3 diffColor;
float ndotl = dot(s.Normal, lightDir);
diffColor = ndotl * s.Albedo;
//스펙큘러 적용
float3 specColor;
float3 H = normalize(viewDir + lightDir);
float spec = dot(H,s.Normal);
specColor = spec * _SpecCol.rgb;
//Rim 적용
float3 rimColor;
float rim = dot(viewDir, s.Normal);
float invertRim = 1 - rim;
rimColor = invertRim;
final.rgb = diffColor + specColor + rimColor;
final.a = s.Alpha;
return final;
}
ENDCG
}
FallBack "Diffuse"
}
일단 기본적인 값을 넣고 나중에는
diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;
여기에 추가를 하여서 디테일을 살려준다.
----
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpMap ("NormalMap", 2D) = "bump" {}
_SpecPow ("Specular Power", Float) = 50.0
_SpecCol ("specular Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf _Test
sampler2D _MainTex;
sampler2D _BumpMap;
float _SpecPow;
float4 _SpecCol;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Albedo = c.rgb;
o.Alpha = c.a;
}
float4 Lighting_Test (SurfaceOutput s, float3 lightDir, float viewDir, float atten){
float4 final;
//램버트 적용
float3 diffColor;
float ndotl = saturate(dot(s.Normal, lightDir));
diffColor = ndotl * s.Albedo * _LightColor0.rgb * atten;
//스펙큘러 적용
float3 specColor;
float3 H = normalize(viewDir + lightDir);
float spec = dot(H,s.Normal);
specColor = spec * _SpecCol.rgb;
//Rim 적용
float3 rimColor;
float rim = dot(viewDir, s.Normal);
float invertRim = 1 - rim;
rimColor = pow(invertRim, 6) * 0.5;
final.rgb = diffColor + specColor + rimColor;
final.a = s.Alpha;
return final;
}
ENDCG
}
FallBack "Diffuse"
}
좀더 세부적으로 조절 할 수 있는 값들을 넣어준다.
노앰비언트를 꺼주고, 전체적으로 만져준다.
반응형
'Unity > 그래픽스프로그래밍' 카테고리의 다른 글
0507 _ 툰쉐이더 _ 음영을 계단식 -> 2pass 로 외곽 만들어준다. (0) | 2021.05.07 |
---|---|
0507_ 외곽선 만들어보기 (0) | 2021.05.07 |
0506_ Lambert에서 BlinnPhong 스펙큘러 만들기 (0) | 2021.05.06 |
0506_ 홀로그램 만들기 (0) | 2021.05.06 |
0506 _ RIM 라이트 표현하기 (0) | 2021.05.06 |