ЧЯДНТ? Шейдер выворачивает меш наизнанку

Для экспериментальных разработок и тем "я нашел чужой исходник, почему он не работает?"

ЧЯДНТ? Шейдер выворачивает меш наизнанку

Сообщение Poroh 28 сен 2015, 17:45

Делаю 2д игрушку, карту решил делать в виде единого меша из квадратиков, частично друг друга перекрывающих.
Но, квадратики, находящиеся дальше от камеры, почему-то рисуются поверх тех, что ближе. Я так понял, что проблема в шейдере, который я использую для материала (это стандартный Sprites-Default, чуть дополненный для рисования второго куска текстуры поверх первого):
Синтаксис:
Используется csharp
Shader "Sprites/Two Textures"
{
        Properties
        {
                _MainTex ("Sprite Texture", 2D) = "white" {}
                _Color ("Tint", Color) = (1,1,1,1)
                _DecalTex ("Decal (RGBA)", 2D) = "black" {}
                [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        }

        SubShader
        {
                Tags
                {
                        "Queue"="Transparent"
                        "IgnoreProjector"="True"
                        "RenderType"="Transparent"
                        "PreviewType"="Plane"
                        "CanUseSpriteAtlas"="True"
                }

                Cull Off
                Lighting Off
                ZWrite Off
                Blend One OneMinusSrcAlpha

                Pass
                {
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma multi_compile _ PIXELSNAP_ON
                        #include "UnityCG.cginc"
                       
                        struct appdata_t
                        {
                                float4 vertex    : POSITION;
                                float4 color     : COLOR;
                                float2 texcoord0 : TEXCOORD0;
                                float2 texcoord1 : TEXCOORD1;
                        };

                        struct v2f
                        {
                                float4 vertex    : SV_POSITION;
                                fixed4 color     : COLOR;
                                half2 texcoord0  : TEXCOORD0;
                                half2 texcoord1  : TEXCOORD1;
                        };
                       
                        fixed4 _Color;

                        v2f vert(appdata_t IN)
                        {
                                v2f OUT;
                                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
                                OUT.texcoord0 = IN.texcoord0;
                                OUT.texcoord1 = IN.texcoord1;
                                OUT.color = IN.color * _Color;
                                #ifdef PIXELSNAP_ON
                                OUT.vertex = UnityPixelSnap (OUT.vertex);
                                #endif

                                return OUT;
                        }

                        sampler2D _MainTex;
                        sampler2D _DecalTex;
                        float _AlphaSplitEnabled;

                        fixed4 SampleSpriteTexture (float2 uv)
                        {
                                fixed4 color = tex2D (_DecalTex, uv);
                                if (_AlphaSplitEnabled)
                                        color.a = tex2D (_MainTex, uv).r;
                                return color;
                        }

                        fixed4 frag(v2f IN) : SV_Target
                        {
                                fixed4 c = SampleSpriteTexture (IN.texcoord0);
                                half4 decal = tex2D(_DecalTex, IN.texcoord1);
                                c.rgb = lerp (c.rgb, decal.rgb, decal.a) * c.a;
                                return c * IN.color;
                        }
                ENDCG
                }
        }
}
 


Получается вот так (это картинка не с камеры, а из редактора, но на камере все точно так же, но без поворота):
Скрытый текст:
Изображение


Я пробовал исходный шейдер - картина та же, а при стандартном шейдере все рисуется как надо.

Я попробовал поменять ZWrite Off на ZWrite On, и проблема с глубиной решилась, но появилась вот такая дурацкая проблема с прозрачностью, с которой я вообще не знаю как справиться:

Скрытый текст:
Изображение


Посоветуйте, пожалуйста, как это поправить?
Poroh
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2014, 21:47

Re: ЧЯДНТ? Шейдер выворачивает меш наизнанку

Сообщение samana 28 сен 2015, 18:42

Так может вам будет достаточно просто сортировать спрайты Order in Layer (в инспекторе)?
Извиняюсь, если не правильно понял тему :-o
Последний раз редактировалось samana 28 сен 2015, 18:52, всего редактировалось 1 раз.
Аватара пользователя
samana
Адепт
 
Сообщения: 4172
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: ЧЯДНТ? Шейдер выворачивает меш наизнанку

Сообщение Poroh 28 сен 2015, 18:51

это не спрайты же, это один меш. если я буду делать задуманное спрайтами, то у меня память кончится быстрее, чем они досоздадутся до конца
Poroh
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2014, 21:47

Re: ЧЯДНТ? Шейдер выворачивает меш наизнанку

Сообщение jetyb 29 сен 2015, 09:00

Используйте Transparent-Cutout шейдер
jetyb
Адепт
 
Сообщения: 1353
Зарегистрирован: 31 окт 2011, 17:21

Re: ЧЯДНТ? Шейдер выворачивает меш наизнанку

Сообщение Poroh 29 сен 2015, 15:50

jetyb писал(а):Используйте Transparent-Cutout шейдер

Да, я потом тоже на него обратил внимание. Эксперименты показали, что достаточно добавить clip(c.a - 0.5); в мой шейдер, чтобы все заработало как надо.
Финальная версия, если кому пригодится:
Синтаксис:
Используется csharp
Shader "Sprites/Two Textures"
{
        Properties
        {
                _MainTex ("Sprite Texture", 2D) = "white" {}
                _Color ("Tint", Color) = (1,1,1,1)
                _DecalTex ("Decal (RGBA)", 2D) = "black" {}
                [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        }

        SubShader
        {
                Tags
                {
                        "Queue"="Transparent"
                        "IgnoreProjector"="True"
                        "RenderType"="TransparentCutout"
                        "PreviewType"="Plane"
                        "CanUseSpriteAtlas"="True"
                }

                Cull Off
                Lighting Off
                ZWrite On
                Blend One OneMinusSrcAlpha

                Pass
                {
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma multi_compile _ PIXELSNAP_ON
                        #include "UnityCG.cginc"
                       
                        struct appdata_t
                        {
                                float4 vertex    : POSITION;
                                float4 color     : COLOR;
                                float2 texcoord0 : TEXCOORD0;
                                float2 texcoord1 : TEXCOORD1;
                        };

                        struct v2f
                        {
                                float4 vertex    : SV_POSITION;
                                fixed4 color     : COLOR;
                                half2 texcoord0  : TEXCOORD0;
                                half2 texcoord1  : TEXCOORD1;
                        };
                       
                        fixed4 _Color;

                        v2f vert(appdata_t IN)
                        {
                                v2f OUT;
                                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
                                OUT.texcoord0 = IN.texcoord0;
                                OUT.texcoord1 = IN.texcoord1;
                                OUT.color = IN.color * _Color;
                                #ifdef PIXELSNAP_ON
                                OUT.vertex = UnityPixelSnap (OUT.vertex);
                                #endif

                                return OUT;
                        }

                        sampler2D _MainTex;
                        sampler2D _DecalTex;
                        float _AlphaSplitEnabled;

                        fixed4 SampleSpriteTexture (float2 uv)
                        {
                                fixed4 color = tex2D (_DecalTex, uv);
                                if (_AlphaSplitEnabled)
                                        color.a = tex2D (_MainTex, uv).r;
                                return color;
                        }

                        fixed4 frag(v2f IN) : SV_Target
                        {
                                fixed4 c = SampleSpriteTexture (IN.texcoord0);
                                half4 decal = tex2D(_DecalTex, IN.texcoord1);
                                c.rgb = lerp (c.rgb, decal.rgb, decal.a);
                                clip(c.a - 0.5);
                                return c * IN.color;
                        }
                ENDCG
                }
        }
}
 


Скрытый текст:
Изображение
Poroh
UNIт
 
Сообщения: 51
Зарегистрирован: 22 сен 2014, 21:47


Вернуться в Шейдерная кузня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2