유니티3D 프로그래밍
Unity Shader 연습 (21.05.03, 21.05.06~07) 본문
색 변경
Shader "Custom/Test"
{
Properties
{
_R ("Red", Range(0, 1)) = 0.0
_G ("Green", Range(0, 1)) = 0.0
_B ("Blue", Range(0, 1)) = 0.0
_Brightness ("Brightness", Range(-1, 1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
struct Input
{
float2 uv_MainTex;
};
float _R;
float _G;
float _B;
float _Brightness;
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = float3(_R, _G, _B) + _Brightness;
}
ENDCG
}
FallBack "Diffuse"
}
2개의 이미지 합체
Shader "Custom/Test2"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_MainTex2("Sand Texture", 2D) = "white" {}
_MainTex3("Test", 2D) = "white" {}
_lerpTest("lerp", Range(0,1)) = 0
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
sampler2D _MainTex;
sampler2D _MainTex2;
sampler2D _MainTex3;
float _lerpTest;
struct Input
{
float2 uv_MainTex;
float2 uv_MainTex2;
float2 uv_MainTex3;
};
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
fixed4 e = tex2D(_MainTex3, IN.uv_MainTex3);
fixed4 avg = (d.r + d.g + d.b)/3;
o.Albedo = lerp(c.rgb, avg, 1-c.a);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
움직이는 큐브
Shader "Custom/Test3"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Standard
sampler2D _MainTex;
float _FlowSpeed;
struct Input
{
float2 uv_MainTex;
};
fixed4 _Color;
void surf(Input IN, inout SurfaceOutputStandard o)
{
float4 c = tex2D(_MainTex, float2(IN.uv_MainTex.x, IN.uv_MainTex.y + _Time.y));
o.Albedo = c.rgb;
//o.Emission = float3(IN.uv_MainTex.x, IN.uv_MainTex.y, 0);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
움직이는 화염
Shader "Custom/Fire"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_MainTex2("Albedo (RGB)", 2D) = "white" {}
_Speed("Speed", Range(0, 20)) = 0.0
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
CGPROGRAM
#pragma surface surf Standard alpha:fade
sampler2D _MainTex;
sampler2D _MainTex2;
float _Speed;
struct Input
{
float2 uv_MainTex;
float2 uv_MainTex2;
};
fixed4 _Color;
void surf(Input IN, inout SurfaceOutputStandard o)
{
float4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x * 3, IN.uv_MainTex2.y - _Speed * _Time.y));
float4 c = tex2D(_MainTex, IN.uv_MainTex + d.r);
o.Emission = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
빛 반사 효과(Lambert)
Shader "Custom/Light"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("NormalMap", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Test noambient
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
o.Alpha = c.a;
}
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten) {
//Lambert
//0 ~ 1 사이로 잘라준다
//float ndotl = saturate(dot(s.Normal, lightDir));
//float ndotl = max (0, dot(s.Normal, lightDir) );
//half-lambert
float ndotl = saturate(dot(s.Normal, lightDir)) * 0.5 + 0.5;
float4 final;
//_LightColor0: 조명의 색상이나 강도저장된 내장변수
final.rgb = ndotl * s.Albedo * _LightColor0.rgb * atten;
final.a = s.Alpha;
return final;
}
ENDCG
}
FallBack "Diffuse"
}
빛 강조(Rim)
Shader "Custom/Test4"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("NormalMap", 2D) = "white" {}
_RimColor("RimColor", Color) = (1,1,1,1)
_RimPow("RimPow", Range(1, 10)) = 3
}
SubShader
{
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert //noambient
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPow;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
float rim = saturate(dot(o.Normal, IN.viewDir));
o.Emission = pow(1 - rim, _RimPow) * _RimColor.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
홀로그램
Shader "Custom/Holo"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
//https://docs.unity3d.com/kr/530/Manual/SL-Pass.html
Pass{
ColorMask 0
}
CGPROGRAM
#pragma surface surf Lambert noambient alpha:fade
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldPos;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//o.Albedo = 0;//c.rgb;
float ndotv = saturate(dot(o.Normal, IN.viewDir));
o.Emission = float3(0, 1, 0);
float rim = pow(1 - ndotv, 3) + pow(frac(IN.worldPos.g * 10 - _Time.y * 2), 3);// float3(0,1,0); 1.1 -> 0.1, 1.9->0.9 0 ~ 0.9
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
홀로그램 2
Shader "Custom/Holo"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("NormalMap", 2D) = "white" {}
_RimPower("RimPower", Float) = 3
_Interval("Interval", Range(0, 100)) = 0.0
_Speed("Speed", Range(0, 10)) = 0.0
_FracPower("FracPower", Float) = 3
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
Pass{
ColorMask 0
}
CGPROGRAM
#pragma surface surf Lambert noambient alpha:fade
sampler2D _MainTex;
float _RimPower;
float _Interval;
float _Speed;
float _FracPower;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
float3 worldPos;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
//o.Albedo = 0;//c.rgb;
//float ndotv = saturate(dot(o.Normal, IN.viewDir));
o.Emission = float3(0, 1, 0);
float rim = saturate(dot(o.Normal, IN.viewDir));
rim = saturate(pow(1 - rim, _RimPower) * pow(frac(IN.worldPos.g * _Interval - _Time.y * _Speed), _FracPower) * 0.5);
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
blinnPhon
Shader "Custom/BlinnPhong"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("Normal Map", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf _MyLambert
sampler2D _MainTex;
sampler2D _BumpMap;
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_MyLambert(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) {
float ndotl = dot(s.Normal, lightDir);
float4 final;
float3 H = normalize(lightDir + viewDir);
float spec = saturate(dot(H, s.Normal));
return spec;
/* final.rgb = s.Albedo * ndotl;
final.a = s.Alpha;
return final;*/
}
ENDCG
}
FallBack "Diffuse"
}
blinnPhon Upgrade
Shader "Custom/BlinnPhong"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("Normal Map", 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, float3 viewDir, float atten) {
//램버트 공식
float ndotl = dot(s.Normal, lightDir);
//스패큘러 공식 적용
float3 H = normalize(lightDir + viewDir);
float spec = dot(H, s.Normal);
spec = pow(spec, _SpecPow);
//스패큘러 색상 적용, _SpecColor 내장 변수
float3 specColor;
specColor = spec * _SpecCol.rgb;
//알베도 적용
float4 final;
final.rgb = (ndotl * s.Albedo) + specColor.rgb;
final.a = s.Alpha;
return spec;
/* final.rgb = s.Albedo * ndotl;
final.a = s.Alpha;
return final;*/
}
ENDCG
}
FallBack "Diffuse"
}
Vertex
Shader "Custom/Vertex"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Thickness("Line Thickness", Range(0.001, 0.01)) = 0.001
_TintColor("Color", Color) = (1.0, 1.0, 1.0, 1.0)
_BumpMap("NormalMap", 2D) = "bump" {}
_Color("Color", Color) = (1,1,1,1)
_Power("Power", Range(1, 10)) = 1
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 200
Cull Front
CGPROGRAM
#pragma surface surf _NoLight vertex:vert noshadow noambient
sampler2D _MainTex;
float _Thickness;
float4 _TintColor;
void vert(inout appdata_full v) {
v.vertex.xyz = v.vertex.xyz + v.normal.xyz * _Thickness;
}
struct Input
{
float4 _TintColor: COLOR;
};
void surf(Input IN, inout SurfaceOutput o)
{
o.Albedo = IN._TintColor.rgb;
}
float4 Lighting_NoLight(SurfaceOutput s, float3 lightDir, float atten) {
return float4(0, 0, 0, 1);
}
ENDCG
Cull Back
//2pass
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _Color;
float _Power;
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
float rim = saturate(dot(o.Normal, IN.viewDir));
o.Emission = pow(1 - rim, _Power) * _Color.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Toon
Shader "Custom/Toon"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags{"RenderType" = "Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf _Toon noambient
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
float4 Lighting_Toon(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
{
//harf-lambert
float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
ndotl = ndotl * 5;
ndotl = ceil(ndotl) / 5;
//Rim
float rim = abs(dot(s.Normal, viewDir));
if (rim > 0.3)
{
rim = 1;
}
else
{
rim = 0;
}
float4 final;
final.rgb = ndotl * s.Albedo * rim;
final.a = s.Alpha;
return rim;
}
ENDCG
}
FallBack "Diffuse"
}
Diffuse Warping
Shader "Custom/Test"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RampTex ("Ramp Texture", 2D) = "white" {}
_BumpMap ("Normal Map", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf _Warp noambient
sampler2D _MainTex;
sampler2D _RampTex;
sampler2D _BumpMap;
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_Warp(SurfaceOutput s, float3 lightDir, float atten){
float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
float4 ramp = tex2D(_RampTex, float2(ndotl, 0.5));
float4 final;
final.rgb = s.Albedo * ramp.rgb;
final.a = s.Alpha;
return final;
}
ENDCG
}
FallBack "Diffuse"
}
Reflection
Shader "Custom/Reflector"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BumpMap("NormalMap", 2D) = "white" {}
_Cube("CubeMap", Cube) = ""{}
}
SubShader
{
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _BumpMap;
samplerCUBE _Cube;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 worldRefl;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
float4 re = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal));
o.Albedo = c.rgb * 0.5;
o.Emission = re.rgb * 0.5;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
'Unity > 수업내용' 카테고리의 다른 글
Unity ML-Agent Penguin (21.05.25) (0) | 2021.05.25 |
---|---|
Unity ML-Agent 연습 (21.05.17~18) (0) | 2021.05.18 |
Unity 간단한 게임 구현 (21.04.29~30) (0) | 2021.04.30 |
Unity NGUI 클릭 움직임 구현 (21.04.28) (0) | 2021.04.28 |
Unity UGUI 상점 창 구현 (21.04.23) (0) | 2021.04.23 |