๋ชจ๋ฐ์ผ์์ ์ด๋์ ๋ ์ ๋์๊ฐ๋ PBR ๊ตฌํํด๋ดค์ต๋๋ค. (์ง์ง ๋ฌผ๋ฆฌ๋ ์๋๊ณ ๋ฌผ๋ฆฌ์ฒ๋ผ ๋ณด์ด๋ Fake์ ๋๋ค.)
๊ธฐ์กด Standard์์ด๋๋ณด๋ค๋ ์๋ฑํ๊ฒ ๊ฐ๋ณ์ต๋๋ค.
๋ฐ์ฌํจ๊ณผ๋ ๋ฆฌํ๋ ์ ํ๋ก๋ธ ๋ฐ์ดํฐ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ๋ฆฌํ๋ ์ ํ๋ก๋ธ๋ฅผ ๊ตฌ์์ฃผ์ธ์. (๋ฆฌ์ผํ์ ๋ฆฌํ๋ ์ ์ ์์ฐ๋๊ฒ ์ข์ต๋๋ค.)
๋ผ์ดํธ ํ๋ก๋ธ๋ ์ปฌ๋ฌ ๋ฐ์์ต๋๋ค. (ํฌ๊ฒ ํฐ๊ฐ ๋์ง ์์ต๋๋ค๋ง....)
๋น์ฐํ๊ฒ๋ ํ ์ค์ฒ ํด์๋๊ฐ ๋์์ง๋ฉด ๋ฌด๊ฑฐ์์ง๋๋ค. (ํนํ ๋ ธ๋ฉ๋งต ๋ง์ด ๋ฌด๊ฑฐ์ฐ๋ ์ฃผ์ํ์ธ์.)
โป SRP๋ ์ง์์ํฉ๋๋ค.
ํ๋จ์ ์์ด๋ ์ฝ๋์ ๋๋ค.
Shader "Ageia/MobilePBR" {
Properties {
[Header(Shadow)]
[Toggle]_USESHADOW("Use Shadow&Light?(๋ผ์ดํ , ๊ทธ๋ฆผ์ ์ฌ์ฉ์ฌ๋ถ)", float) = 0
[Header(_______________________________________________________________________________________________________________________________________)]
[Header(Albedo)]
[HDR]_Color ("Color", Color) = (1, 1, 1, 1)
_MainTex ("Albedo (RGB)", 2D) = "gray" {}
[Header(Normal)]
[Toggle]_USENORMAL("UseNormalmap?(๋ ธ๋ฉ๋งต์ฌ์ฉ)", float) = 0
[Normal][NoScaleOffset]_Normal("Normal", 2D) = "bump"{}
[Toggle]_USENORMALPOW("UseNormalPow?(๋ ธ๋ฉ๊ฐ๋ ์ฌ์ฉ์ฌ๋ถ)", float) = 0
_NormalPow("NormalPow(๋ ธ๋ฉ๊ฐ๋)", Range(0, 3)) = 1
[Header(_______________________________________________________________________________________________________________________________________)]
[Header(Specular)]
[KeywordEnum(NoSpec, Spec, SpecHDR)]
_SPECTYPE("SpecType(์คํํ๋ฌ ์ฌ์ฉ์ฌ๋ถ)", float) = 0
[PowerSlider(200)]_SpecPow("SpecPow(์คํํ๋ฌ ๋ฉด์ )", Range(1, 200)) = 200
_SpecMul("SpecMul(์คํํ๋ฌ ๊ฐ๋)", Range(0, 10)) = 10
[NoScaleOffset]_PBR("Metallic(RGB)Smoothness(A)", 2D) = "white"{}
[Header(_______________________________________________________________________________________________________________________________________)]
[Header(Emission)]
[Toggle]_EMISSIONUSE("Use Emission? (Emission ์ฌ์ฉ)", float) = 0
[NoScaleOffset]_Emission("Emission", 2D) = "white" {}
[HDR]_EmissionColor("EmissionColor", Color) = (0, 0, 0, 0)
[Header(_______________________________________________________________________________________________________________________________________)]
[Header(Reflection)]
[KeywordEnum(NoRef, Ref, RefHDR)]
_REFTYPE("RefType(๋ฐ์ฌ ์ฌ์ฉ์ฌ๋ถ)", float) = 0
[PowerSlider(20)]_ReflectionPow("RefPow(๋ฐ์ฌ๋๋น)", Range(1, 20)) = 1
_ReflectionMul("RefMul(๋ฐ์ฌ๋ฐ๊ธฐ)", Range(1, 10)) = 1.5
_ReflectionPow_InShadow("RefPow_InShadow(์๋์ฐ ๋ฆฌํ๋ ์ )", Range(0, 3)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf CumstomLighing fullforwardshadows nolightmap nodynlightmap nodirlightmap nofog nometa noforwardadd nolppv noshadowmask interpolateview
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
#pragma multi_compile _USENORMAL_OFF _USENORMAL_ON //๋ ธ๋ฉ ์ฌ์ฉ์ฌ๋ถ
#pragma multi_compile _USENORMALPOW_OFF _USENORMALPOW_ON //๋ ธ๋ฉ ํ์
#pragma multi_compile _SPECTYPE_NOSPEC _SPECTYPE_SPEC _SPECTYPE_SPECHDR //์คํํ๋ฌ
#pragma multi_compile _EMISSIONUSE_OFF _EMISSIONUSE_ON //์๋ฏธ์ ์ฌ์ฉ
#pragma multi_compile _REFTYPE_NOREF _REFTYPE_REF _REFTYPE_REFHDR //๋ฐ์ฌ
#pragma multi_compile _USESHADOW_OFF _USESHADOW_ON //๊ทธ๋ฆผ์
sampler2D _MainTex;
sampler2D _Normal;
sampler2D _PBR;
sampler2D _Emission;
struct CustomData {
half3 Albedo;
half3 Normal;
half3 Emission;
half Alpha;
half3 RefCustomData;
};
struct Input {
float2 uv_MainTex;
//half2 uv_Normal;
half3 viewDir;
#if _REFTYPE_NOREF
#elif _REFTYPE_REF
half3 worldRefl; //WorldReflectionVector ๋ฐ์ดํฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
INTERNAL_DATA //worldRefl ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํด๋น ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์๋ก ํจ.
#elif _REFTYPE_REFHDR
half3 worldRefl; //WorldReflectionVector ๋ฐ์ดํฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
INTERNAL_DATA //worldRefl ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํด๋น ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์๋ก ํจ.
#endif
};
fixed4 _Color;
half _NormalPow;
half _SpecPow;
half _SpecMul;
half3 _EmissionColor;
half _RefView;
half _ReflectionPow;
half _ReflectionMul;
half _ReflectionPow_InShadow;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout CustomData o) {
//Normal
#if _USENORMAL_ON
half3 NormalFinal = UnpackNormal(tex2D(_Normal, IN.uv_MainTex));
#if _USENORMALPOW_ON
o.Normal = lerp(o.Normal, NormalFinal, _NormalPow);
#elif _USENORMALPOW_OFF
o.Normal = NormalFinal;
#endif
#elif _USENORMAL_OFF
#endif
//๋ทฐ ๋๋ ์ ๋ด์
half NdotV = dot(o.Normal, IN.viewDir) * 0.5 + 0.5;
//DiffuseColor
half3 c = tex2D(_MainTex, IN.uv_MainTex);
//Metallic
half4 _PBRMask = tex2D(_PBR, IN.uv_MainTex);
//Spec
#if _SPECTYPE_SPEC //๊ธฐ๋ณธ ์คํํ๋ฌ
half3 SpecFinal = saturate(pow(NdotV, _SpecPow) * _PBRMask.a * c * _SpecMul); //๋ณด๊ฐ
#elif _SPECTYPE_SPECHDR //HDR์คํํ๋ฌ
half3 SpecFinal = pow(NdotV, _SpecPow) * _PBRMask.a * (c * _SpecMul); //HDR
#elif _SPECTYPE_NOSPEC //์คํํ๋ฌ ์ฌ์ฉ์ํจ
#endif
//Albedo
#if _SPECTYPE_SPEC //์คํํ๋ฌ ์ฌ์ฉ
half3 AlbedoFinal = c * NdotV + SpecFinal;
#elif _SPECTYPE_SPECHDR //์คํํ๋ฌ ์ฌ์ฉ
half3 AlbedoFinal = c * NdotV + SpecFinal;
#elif _SPECTYPE_NOSPEC //์คํํ๋ฌ ์ฌ์ฉ์ํจ
half3 AlbedoFinal = c * NdotV;
#endif
//Emission
#if _EMISSIONUSE_OFF
#elif _EMISSIONUSE_ON
half3 EmissionFinal = tex2D(_Emission, IN.uv_MainTex) * _EmissionColor;
o.Emission = EmissionFinal;
#endif
//Reflection
#if _REFTYPE_NOREF
#elif _REFTYPE_REF
half3 Reflection1 = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, WorldReflectionVector(IN, o.Normal)) * unity_SpecCube0_HDR.r; //unity_SpecCube0_HDR.r : ๋ฆฌํ๋ ์ ํ๋ธ์ Intensity๊ฐ.
half3 Reflection2 = UNITY_SAMPLE_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0, WorldReflectionVector(IN, o.Normal)) * unity_SpecCube0_HDR.r; //Reflection2๋ ๋ค๋ฅธ ๋ฆฌํ๋ ์ ํ๋ก๋ธ์์ ๋ณด๊ฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ํ์์๋ ๊ฒฝ์ฐ ์ ๊ฑฐ ํ์ญ์์ค. //unity_SpecCube0_BoxMin.w : ๋๊ฐ์ ๋ฆฌํ๋ ์ ํ๋ก๋ธ๋ฅผ ๋ณด๊ฐํฉ๋๋ค.
half3 ReflectionFinal = clamp((pow(lerp(Reflection2, Reflection1, unity_SpecCube0_BoxMin.w), _ReflectionPow) * _ReflectionMul), 0, 2); //์ต๋ ๋ฐ๊ธฐ ๋ณด๊ฐ.
#elif _REFTYPE_REFHDR
half3 Reflection1 = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, WorldReflectionVector(IN, o.Normal)) * unity_SpecCube0_HDR.r; //unity_SpecCube0_HDR.r : ๋ฆฌํ๋ ์ ํ๋ธ์ Intensity๊ฐ.
half3 Reflection2 = UNITY_SAMPLE_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0, WorldReflectionVector(IN, o.Normal)) * unity_SpecCube0_HDR.r; //Reflection2๋ ๋ค๋ฅธ ๋ฆฌํ๋ ์ ํ๋ก๋ธ์์ ๋ณด๊ฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ํ์์๋ ๊ฒฝ์ฐ ์ ๊ฑฐ ํ์ญ์์ค. //unity_SpecCube0_BoxMin.w : ๋๊ฐ์ ๋ฆฌํ๋ ์ ํ๋ก๋ธ๋ฅผ ๋ณด๊ฐํฉ๋๋ค.
half3 ReflectionFinal = pow(lerp(Reflection2, Reflection1, unity_SpecCube0_BoxMin.w), _ReflectionPow) * _ReflectionMul;
#endif
//Albedo
#if _REFTYPE_NOREF
o.Albedo = AlbedoFinal * _Color;
#elif _REFTYPE_REF
o.Albedo = lerp(AlbedoFinal, ReflectionFinal * c * _PBRMask.rgb
#if _SPECTYPE_SPEC //์คํํ๋ฌ ์ฌ์ฉ
+ SpecFinal
#elif _SPECTYPE_SPECHDR //์คํํ๋ฌ ์ฌ์ฉ
+ SpecFinal
#endif
, _PBRMask.rgb) * _Color;
#elif _REFTYPE_REFHDR
o.Albedo = lerp(AlbedoFinal, ReflectionFinal * c * _PBRMask.rgb
#if _SPECTYPE_SPEC //์คํํ๋ฌ ์ฌ์ฉ
+ SpecFinal
#elif _SPECTYPE_SPECHDR //์คํํ๋ฌ ์ฌ์ฉ
+ SpecFinal
#endif
, _PBRMask.rgb) * _Color;
#endif
o.Alpha = 1;
//ReflectionData
#if _REFTYPE_NOREF
#elif _REFTYPE_REF
o.RefCustomData = ReflectionFinal * c * _PBRMask.rgb;
#elif _REFTYPE_REFHDR
o.RefCustomData = ReflectionFinal * c * _PBRMask.rgb;
#endif
}
half4 LightingCumstomLighing(CustomData s, half3 lightDir, half atten)
{
half4 c;
#if _USESHADOW_OFF
#elif _USESHADOW_ON
half3 shadowMask = atten * _LightColor0; //๊ทธ๋ฆผ์ + ๋ผ์ดํ ์ปฌ๋ฌ
#endif
#if _REFTYPE_NOREF
c.rgb = s.Albedo
//์๋์ฐ ์ ์ฉ
#if _USESHADOW_OFF
#elif _USESHADOW_ON
* shadowMask
#endif
;
#elif _REFTYPE_REF
#if _USESHADOW_ON
half3 RefColor = lerp(s.RefCustomData * _ReflectionPow_InShadow, shadowMask, saturate(shadowMask)); //๊ทธ๋ฆผ์ ๋ด์์์ ๋ฐ์ฌ
#elif _USESHADOW_OFF
half3 RefColor = s.RefCustomData; //๊ทธ๋ฆผ์ ๋ด์์์ ๋ฐ์ฌ
#endif
c.rgb = s.Albedo * RefColor;
#elif _REFTYPE_REFHDR
#if _USESHADOW_ON
half3 RefColor = lerp(s.RefCustomData * _ReflectionPow_InShadow, shadowMask, saturate(shadowMask)); //๊ทธ๋ฆผ์ ๋ด์์์ ๋ฐ์ฌ
#elif _USESHADOW_OFF
half3 RefColor = s.RefCustomData; //๊ทธ๋ฆผ์ ๋ด์์์ ๋ฐ์ฌ
#endif
c.rgb = s.Albedo * RefColor;
#endif
c.a = s.Alpha;
return c;
}
ENDCG
}
FallBack "Diffuse"
}
๋จธ์ฏ์ - dc App
์์ด๋๋งจ ์ง์ง ๋๋จํ๋ค
์ฉ๋นใ ใ ๊ตณ
์ ์ํ๋ ์ ๋ชจ์ ์ง์ ํ์ ๊ฑฐ?
ใด ์๋ ๋ชจ๋ธ๋ง์ ๊ทธ๋ฅ ์ํ๋ก ํผ์จ๊ฒ๋๋ค
๊ฐ๋ฉ์ง๋๋น ์