-
이번엔 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 라이트 연산을 알파채널에 넣고 반투명하게 만드는것인데
반투명하게 만드는법은 전에 만들었던 불을 만드는 방식을 사용하면 된다
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로 입력받은 숫자를 집어넣기만 하면된다
'유니티 > 게임그래픽' 카테고리의 다른 글
홀로그램 응용 (0) 2024.02.24 Fresnel(프레넬) & Rim 라이트 (0) 2024.02.22 Half-Lambert (0) 2024.02.22 Vertex Color 응용 (0) 2024.02.22 Lambert 커스텀 라이트 (0) 2024.02.21