버그 해결을 위한 모든 질문을 던져
0 votes
698 views

사용 유니티 버전은 2018.1.0f2 이고

셰이더 코드는 유니티에서 기본으로 생성되는 코드에 마스크 텍스쳐 추가해서 알파만 적용하는 간단한 코드 입니다

 

Shader "UI/Masking"

{

    Properties

    {

        _MainTex ("Texture", 2D) = "white" {}

        _MaskTex ("Texture", 2D) = "white" {}

    }

    SubShader

    {

        // No culling or depth

        Blend SrcAlpha OneMinusSrcAlpha

        Cull Off ZWrite Off ZTest Always

 

        Pass

        {

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            

            // #include "UnityCG.cginc"

 

            struct appdata

            {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

            };

 

            struct v2f

            {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

            };

            v2f vert (appdata v)

            {

                v2f o;

                o.vertex = UnityObjectToClipPos(v.vertex);

                o.uv = v.uv;

                return o;

            }

            

            sampler2D _MainTex;

            sampler2D _MaskTex;

            fixed4 frag (v2f i) : SV_Target

            {

                fixed4 col = tex2D(_MainTex, i.uv);

                fixed4 mask = tex2D(_MaskTex, i.uv);

                col.a = mask.a;

                return col;

            }

            ENDCG

        }

    }

}

 

에디터상에서는 사진과 같이 잘 적용이 되는 상태 인데요

유니티 플레이를 했을 경우에 알파 영역이 바뀌어 버립니다.

현재 제가 테스트 해봐서 찾은 해당 문제 발생 원인은

Unity에서 제공하고 있는 SpriteAtlas에 포함된 이미지를

사용했을때 발생을 하고 있습니다.

 

제가 아틀라스 설정을 무언가 잘못 하고 있는 것일까요?

asked (17 point) , 698 views
Read/Write Enabled를 켜보면 어떤가요?
Read/Write Enabled 켜보았지만 동일한 현상입니다

2 answers

0 votes
우수 답변

https://github.com/mob-sakai/SoftMaskForUGUI 

찾아 헤메이다 오픈소스 제작된 것을 발견했습니다

기본 unity mask 방식을 유지되어

사용도 간편합니다

answered (17 point)
0 votes
밉맵 꺼보시구 플랫폼이 어딘진 모르겟지만 잘안되시면 빌드 에서 디버그로그로 해당 스프라이트 uv좌표값 출력해서 대조 하시는게 빠를거 같습니다 쉐이더 문제는 아닌듯합니다.
answered (55 point)

감사합니다.

uv 가 아틀라스로 묶인 이미지에서 매인텍스쳐로 선택된 부분이 되네요

그래서 알파 마스크

fixed4 mask = tex2D(_MaskTex, i.uv);

부터 잘못 그려지고 있네요

해결 방안을 찾아 돌아 다니고 있습니다만

https://forum.unity.com/threads/original-uv-when-using-sprite-atlasing.219949/

해결법이 잘안나오네요....

아 쉐이더 코드 UI꺼 쓰신줄 알앗는데 그게 아니군여.. 이미 아틀라스로 묶였기 때문에 같은 크기의 텍스쳐라도 한 이미지 파일로 적용됩니다.

maintexture 의 uv는 아틀라스의 uv를 무난히 가져 왓을것이나 마스크텍스쳐의 uv는 maintexture의 uv를 따라 가기 때문에 당연히 안됩니다.

mesh를 직접 만들어서 uv , uv2를 두개 넣어주시고 maintexture , masktexture uv를 따로 넣어주시면 됩니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

221 질문
346 answers
356 댓글
375 users