viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73fef8efa11d02831ff8a84a4b499fa798f2b758278147511a92edebe5f99113f80905d3e3f6317a46b51c2bd08e85b617eb069ef236ded


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73fef8efa11d02831ff8a84a4b499fa798f2b758278147511a92edebe5f99113fc4c10e553e6616a1df5987304fb64c21a16265aa2e58d700d25796



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73fef8efa11d02831ff8a84a4b499fa798f2b758278147511a92edebe5f99113f80905d3e3f6317a46b51c2eb5dbc0d327eec3cef346aec


๋ชจ๋ฐ”์ผ์—์„œ ์–ด๋А์ •๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š” 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"

}