홀로그램
이번엔 Rim 라이트를 알파에 집어넣어 우리가 흔히 알고 있는 홀로그램의 기본형을 만들어보자
Shader "Custom/NewSurfaceShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = 0;
//rim
float rim = dot(o.Normal, IN.viewDir);
o.Emission = pow(1-rim,3);
}
ENDCG
}
FallBack "Diffuse"
}
Fresnel 기본연산에 반전하여 Emission에 넣고 제곱하여 흰색이 차지하는 분량을 줄였다
이제 홀로그램을 만들어보자. 홀로그램이 만들어지는 핵심원리는
Rim 라이트 연산을 알파채널에 넣고 반투명하게 만드는것인데
15-2일차 불 이펙트
이번에는 여태까지 배운것들을 이용하여 실감나게 움직이는 불 이펙트를 만들어보겠다 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _MainTex2 ("Texture2", 2D) = "white" {} } SubShader {
sangeun00.tistory.com
반투명하게 만드는법은 전에 만들었던 불을 만드는 방식을 사용하면 된다
Shader "Custom/NewSurfaceShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Transparent"} // 추가
CGPROGRAM
#pragma surface surf Lambert alpha:fade // 알파를 투명하게
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//o.Albedo = 0; // 주석처리
//rim
float rim = dot(o.Normal, IN.viewDir);
//o.Emission = pow(1-rim,3); //주석처리
o.Alpha = pow(1-rim, 3);
}
ENDCG
}
FallBack "Diffuse"
}
우선 rim의 반대되는 값을 출력할 예정이니 albedo나 Emission같은 출력값들은 전부 주석처리를 해준다
여기서 Emission에 원하는 색상을 받고 싶다면 Properties에서 색상을 받아와 넣어주면 된다
Shader "Custom/NewSurfaceShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Color("color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
CGPROGRAM
#pragma surface surf Lambert alpha:fade
sampler2D _MainTex;
float4 _Color;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//o.Albedo = 0;
o.Emission = _Color.rgb;
//rim
float rim = dot(o.Normal, IN.viewDir);
//o.Emission = pow(1-rim,3);
o.Alpha = pow(1-rim, 3);
}
ENDCG
}
FallBack "Diffuse"
}
색상을 받아 출력하는건 이미 많이해와서 어렵지 않다
_Color의 이름으로 입력받을 색상을 하나 만들어주고 Emission으로 _Color의 rgb를 출력해준다
색을 조절할수 있게 되었으니 이번엔 Rim 라이트의 두께를 range로 조절하게 만들어보자
Shader "Custom/NewSurfaceShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Color("color", Color) = (1,1,1,1)
_RimPow("Rimpower", range(1,10)) = 3
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
CGPROGRAM
#pragma surface surf Lambert alpha:fade
sampler2D _MainTex;
float4 _Color;
float _RimPow;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//o.Albedo = 0;
o.Emission = _Color.rgb;
//rim
float rim = saturate(dot(o.Normal, IN.viewDir));
//o.Emission = pow(1-rim,3);
o.Alpha = pow(1-rim, _Rimpow);
}
ENDCG
}
FallBack "Diffuse"
}
이건 정말 간단하다 rim의 반전값을 제곱해줄 수를 3대신 range로 입력받은 숫자를 집어넣기만 하면된다