NGUI가 기본적으로 Sprite의 회색처리와 Bright처리를 지원하지 않아서
그동안 회색 처리된 이미지와 Bright처리된 이미지를 별도로 사용하다가,
도저히 노가다와 용량문제로 안되겠어서 구글링의 도움으로 여러 글을 참고로 만들어봤습니다.
NGUI스크립트를 일부 수정하셔야합니다.
대략 다음 순서입니다.
스텝1. 새로운 쉐이더를 추가합니다.
스텝2. 만들어진 Atlas의 Material의 쉐이더를 추가한 쉐이더로 바꿉니다.
스텝3. UIAtlas의 코드를 수정합니다.
스텝4. UISprite의 코드를 수정합니다.
스텝1. 새로운 쉐이더 추가
NGUI/Resources/Shaders에 적당한 이름으로 저장합니다.
001 | Shader "Unlit/Transparent Colored (Gray)" |
005 | _MainTex ( "Base (RGB), Alpha (A)" , 2D) = "black" {} |
006 | _EffectAmount ( "Effect Amount" , Range (0, 1)) = 0.0 |
007 | _Intensity ( "Intencity" , float) = 1.0 |
016 | "Queue" = "Transparent" |
017 | "IgnoreProjector" = "True" |
018 | "RenderType" = "Transparent" |
026 | Blend SrcAlpha OneMinusSrcAlpha |
032 | #pragma fragment frag |
034 | # include "UnityCG.cginc" |
038 | float4 vertex : POSITION; |
039 | float2 texcoord : TEXCOORD0; |
040 | fixed4 color : COLOR; |
045 | float4 vertex : SV_POSITION; |
046 | half2 texcoord : TEXCOORD0; |
047 | fixed4 color : COLOR; |
055 | v2f vert (appdata_t v) |
058 | o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); |
059 | o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); |
064 | fixed4 frag (v2f i) : COLOR |
066 | fixed4 col = tex2D(_MainTex, i.texcoord) * i.color; |
067 | col.rgb = lerp(col.rgb, dot(col.rgb, float3(0.3, 0.59, 0.11)), _EffectAmount) * _Intensity; |
080 | "Queue" = "Transparent" |
081 | "IgnoreProjector" = "True" |
082 | "RenderType" = "Transparent" |
093 | AlphaTest Greater .01 |
094 | Blend SrcAlpha OneMinusSrcAlpha |
095 | ColorMaterial AmbientAndDiffuse |
097 | SetTexture [_MainTex] |
099 | Combine Texture * Primary |
스텝2. 원하는 Atlas의 Material의 쉐이더를 방금 추가한 쉐이더로 바꿉니다.
스텝3. UIAtlas.cs의 코드를 수정합니다.
01 | [HideInInspector][SerializeField] Material material; |
02 | [HideInInspector][SerializeField] Material materialGray; |
03 | [HideInInspector][SerializeField] Material materialBright; |
07 | public Material spriteMaterial |
11 | return (mReplacement != null) ? mReplacement.spriteMaterial : material; |
15 | if (mReplacement != null) |
17 | mReplacement.spriteMaterial = value; |
22 | materialBright = null; |
40 | public Material spriteMaterialGrayscale { |
42 | if (materialGray == null) { |
43 | materialGray = new Material(spriteMaterial); |
44 | materialGray.SetFloat( "_EffectAmount" , 1); |
51 | public Material spriteMaterialBright { |
53 | if (materialBright == null) { |
54 | materialBright = new Material(spriteMaterial); |
55 | materialBright.SetFloat( "_Intensity" , 3); |
57 | return materialBright; |
스텝4. UISprite.cs코드를 수정합니다.
02 | [System.NonSerialized] bool isGray = false; |
03 | [System.NonSerialized] bool isBright = false; |
07 | public override Material material { |
13 | return mAtlas.spriteMaterialGrayscale; |
16 | return mAtlas.spriteMaterialBright; |
18 | return mAtlas.spriteMaterial; |
23 | public void GrayScale(bool gray) { |
26 | panel.RebuildAllDrawCalls(); |
31 | public void Bright(bool bright) { |
34 | panel.RebuildAllDrawCalls(); |
여기까지 하셨으면 작업완료!
아래와 같이 회색처리 / Bright처리 가능합니다.
sprite.GrayScale(true);
sprite.Bright(true);NGUI가 기본적으로 Sprite의 회색처리와 Bright처리를 지원하지 않아서
그동안 회색 처리된 이미지와 Bright처리된 이미지를 별도로 사용하다가,
도저히 노가다와 용량문제로 안되겠어서 구글링의 도움으로 여러 글을 참고로 만들어봤습니다.
NGUI스크립트를 일부 수정하셔야합니다.
대략 다음 순서입니다.
스텝1. 새로운 쉐이더를 추가합니다.
스텝2. 만들어진 Atlas의 Material의 쉐이더를 추가한 쉐이더로 바꿉니다.
스텝3. UIAtlas의 코드를 수정합니다.
스텝4. UISprite의 코드를 수정합니다.
스텝1. 새로운 쉐이더 추가
NGUI/Resources/Shaders에 적당한 이름으로 저장합니다.
001 | Shader "Unlit/Transparent Colored (Gray)" |
005 | _MainTex ( "Base (RGB), Alpha (A)" , 2D) = "black" {} |
006 | _EffectAmount ( "Effect Amount" , Range (0, 1)) = 0.0 |
007 | _Intensity ( "Intencity" , float) = 1.0 |
016 | "Queue" = "Transparent" |
017 | "IgnoreProjector" = "True" |
018 | "RenderType" = "Transparent" |
026 | Blend SrcAlpha OneMinusSrcAlpha |
032 | #pragma fragment frag |
034 | # include "UnityCG.cginc" |
038 | float4 vertex : POSITION; |
039 | float2 texcoord : TEXCOORD0; |
040 | fixed4 color : COLOR; |
045 | float4 vertex : SV_POSITION; |
046 | half2 texcoord : TEXCOORD0; |
047 | fixed4 color : COLOR; |
055 | v2f vert (appdata_t v) |
058 | o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); |
059 | o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); |
064 | fixed4 frag (v2f i) : COLOR |
066 | fixed4 col = tex2D(_MainTex, i.texcoord) * i.color; |
067 | col.rgb = lerp(col.rgb, dot(col.rgb, float3(0.3, 0.59, 0.11)), _EffectAmount) * _Intensity; |
080 | "Queue" = "Transparent" |
081 | "IgnoreProjector" = "True" |
082 | "RenderType" = "Transparent" |
093 | AlphaTest Greater .01 |
094 | Blend SrcAlpha OneMinusSrcAlpha |
095 | ColorMaterial AmbientAndDiffuse |
097 | SetTexture [_MainTex] |
099 | Combine Texture * Primary |
스텝2. 원하는 Atlas의 Material의 쉐이더를 방금 추가한 쉐이더로 바꿉니다.
스텝3. UIAtlas.cs의 코드를 수정합니다.
01 | [HideInInspector][SerializeField] Material material; |
02 | [HideInInspector][SerializeField] Material materialGray; |
03 | [HideInInspector][SerializeField] Material materialBright; |
07 | public Material spriteMaterial |
11 | return (mReplacement != null) ? mReplacement.spriteMaterial : material; |
15 | if (mReplacement != null) |
17 | mReplacement.spriteMaterial = value; |
22 | materialBright = null; |
40 | public Material spriteMaterialGrayscale { |
42 | if (materialGray == null) { |
43 | materialGray = new Material(spriteMaterial); |
44 | materialGray.SetFloat( "_EffectAmount" , 1); |
51 | public Material spriteMaterialBright { |
53 | if (materialBright == null) { |
54 | materialBright = new Material(spriteMaterial); |
55 | materialBright.SetFloat( "_Intensity" , 3); |
57 | return materialBright; |
스텝4. UISprite.cs코드를 수정합니다.
02 | [System.NonSerialized] bool isGray = false; |
03 | [System.NonSerialized] bool isBright = false; |
07 | public override Material material { |
13 | return mAtlas.spriteMaterialGrayscale; |
16 | return mAtlas.spriteMaterialBright; |
18 | return mAtlas.spriteMaterial; |
23 | public void GrayScale(bool gray) { |
26 | panel.RebuildAllDrawCalls(); |
31 | public void Bright(bool bright) { |
34 | panel.RebuildAllDrawCalls(); |
여기까지 하셨으면 작업완료!
아래와 같이 회색처리 / Bright처리 가능합니다.
sprite.GrayScale(true);
sprite.Bright(true);
출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_lecture&wr_id=3561