텍스처 한 장을 받는 쉐이더 작성
Lambert 적용
프레넬 공식 적용 (rim 라이트 공식)
Rim 까지 만들어 놓기
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimColor("Color", Color) = (1,1,1,1)
_RimPow("Pow", Range(0,10)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
float _RimPow;
float4 _RimColor;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float Rim = dot(o.Normal, IN.viewDir);
o.Emission = pow(1 - Rim, _RimPow) * _RimColor.rgb;
o.Albedo = 0;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
-----
랜더 타입을 알파로 해서 투명하게 보이게 하기
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
#pragma surface surf Lambert alpha:fade
추가하기
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow);
//o.Albedo = 0;
o.Alpha = rim;
}
림 값만 받아주기
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimColor("Color", Color) = (1,1,1,1)
_RimPow("Pow", Range(0,10)) = 0
}
SubShader
{
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float _RimPow;
float4 _RimColor;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow);
//o.Albedo = 0;
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
---
컬러 추가하기
----
깜장으로 만들어준다.
Input 에 float3 worldPos; 추가하기
월드 좌표가 컬러로 바뀐다.
태그를
오파큐로 바꾸면 불투명하게되서 여러 색이 섞인다.
RGB 따라 받을 수도 있다. R G B = X Y Z 와 같다.
-----
내장 함수중에 frac이 있다. 소수점 부분만 리턴해준다.
1. 1
1. 2
1. 3
1값은 빼고 0.1 ~ 0.9 값만 리턴해줌
g 값을 프락하면
frac 한 곳에 pow 를 해주면, 더 촘촘해진다.
pow 제곱을 하면 조금 더 부드럽게 보여진다
Shader "Custom/Holo"
{
Properties
{
_RimColor ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPow ("Pow", Range(0,10)) = 0.5
}
SubShader
{
Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float4 _RimColor;
float _RimPow;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow);
//o.Emission = _RimColor.rgb;
o.Emission = pow(frac(IN.worldPos.g), 40);
//o.Alpha = rim;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
제곱을 하면 그려지는 제곱지수함수 ( 리니어한 선을 부드럽게 해주는 것이다.)
prac 파워를 밖에서 뚫어서 관리도 가능 하겠지?
-----
o.Emission = pow(frac(IN.worldPos.g * _G), _fracPow);
g 값과 frac 값이 달라질때의 차이점
frac 값이 달라지면
한 줄 내에 대한 두께가 달라진다.
-
g 값이 달라지면
줄 내부가 아니라 줄 끼리의 간격이 달라진다.
---
Shader "Custom/Holo"
{
Properties
{
_RimColor ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPow ("Pow", Range(0,10)) = 0.5
_fracPow ("FracPow", Range(0,100)) = 0
_G ("G", Range(0,100)) = 0
}
SubShader
{
Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float4 _RimColor;
float _RimPow;
float _fracPow;
float _G;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow);
//o.Emission = _RimColor.rgb;
//o.Emission = pow(frac(IN.worldPos.g), _fracPow);
o.Emission = pow(frac(IN.worldPos.g * _G - _Time.y), _fracPow) * _RimColor.rgb;
//o.Alpha = rim;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
o.Emission = pow(frac(IN.worldPos.g * _G - _Time.y), _fracPow) * _RimColor.rgb;
Emission에 G 위치를 _Time.y 써서 올려준다.
---
간격 // 속도 등등 조절하는 프로퍼티를 만들수도있다
Shader "Custom/Holo"
{
Properties
{
_RimColor ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPow ("Pow", Range(0,10)) = 0.5
_fracPow ("FracPow", Range(0,100)) = 0
_G ("G", Range(0,100)) = 0
_TimeSpeed ("TimeSpeed", Range(0,10)) = 0.5
_Interval ("Interval", Range(0,10)) = 0.5
}
SubShader
{
Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float4 _RimColor;
float _RimPow;
float _fracPow;
float _G;
float _TimeSpeed;
float _Interval;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow);
//o.Emission = _RimColor.rgb;
//o.Emission = pow(frac(IN.worldPos.g), _fracPow);
o.Emission = pow(frac(IN.worldPos.g * _G * _Interval - (_Time.y * _TimeSpeed)), _fracPow) * _RimColor.rgb;
//o.Alpha = rim;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
o.Emission = pow(frac(IN.worldPos.g * _G * _Interval - (_Time.y * _TimeSpeed)), _fracPow) * _RimColor.rgb;
-----
만든 것 알파에 넣어주기
Shader "Custom/Holo"
{
Properties
{
_RimColor ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPow ("Pow", Range(0,10)) = 0.5
_fracPow ("FracPow", Range(0,100)) = 0
_G ("G", Range(0,100)) = 0
_TimeSpeed ("TimeSpeed", Range(0,10)) = 0.5
_Interval ("Interval", Range(0,10)) = 0.5
}
SubShader
{
Tags { "RenderType"="Qpaque" "Queue"="Transparent" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#pragma target 3.0
sampler2D _MainTex;
float4 _RimColor;
float _RimPow;
float _fracPow;
float _G;
float _TimeSpeed;
float _Interval;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Emission = _RimColor;
float rim = dot(o.Normal, IN.viewDir);
rim = pow(1 - rim, _RimPow) + pow(frac(IN.worldPos.g * _Interval - (_Time.y * _TimeSpeed)), _fracPow);
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
-----
Emission에 직접 없어서 투명하게가 아니라 일반적인 텍스쳐에 입혀보기
Shader "Custom/Holo"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Normal ("Normal", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_RimPow("RimPow", Range(0,10)) = 0
_RracPow("PracPow", Range(0,100)) = 0
_G ("GPow", Range(0,100)) = 0
_TimeSeed ("TimeSpeed", Range(0,100)) = 0
}
SubShader
{
Tags {"RenderType"="Qpaque" "Queue"="Transparent"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
sampler2D _Normal;
float4 _Color;
float _RracPow;
float _G;
float _TimeSeed;
float _RimPow;
struct Input
{
float2 uv_MainTex;
float2 uv_Normal;
float3 viewDir;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_Normal, IN.uv_Normal));
o.Albedo = c.rgb;
float rim = saturate(dot(o.Normal, IN.viewDir));
o.Emission = saturate((pow(1 - rim, _RimPow) + pow(frac(IN.worldPos.g * _G - (_Time.y * _TimeSeed)), _RracPow)) * _Color.rgb);
}
ENDCG
}
FallBack "Diffuse"
}
'Unity > 그래픽스프로그래밍' 카테고리의 다른 글
0507 _ Lim 라이트를 커스텀 라이트로 옮기기 (0) | 2021.05.07 |
---|---|
0506_ Lambert에서 BlinnPhong 스펙큘러 만들기 (0) | 2021.05.06 |
0506 _ RIM 라이트 표현하기 (0) | 2021.05.06 |
0506_유니티 그래픽스 라이트 연산에 대하여 (0) | 2021.05.06 |
0504 _ 라이트에 따른 쉐이더 // 노멀 및 여러맵 넣었을 때 차이점 (0) | 2021.05.04 |