Подправить шейдер 2D Water

Шейдеры и все-все-все.

Подправить шейдер 2D Water

Сообщение tarasevih 12 янв 2016, 23:07

Всем Привет с прошедшими праздниками вас !
Имеется собственно вот такой Shader
Синтаксис:
Используется csharp
// Unlit
// Supports vertex color
// No lightmap
// Transparent



Shader "Water2D/Simple Water" {
    Properties

    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D ) = "white" {}
        _WiggleTex ("Base (RGB)", 2D) = "white" {}
                _WiggleStrength ("Wiggle Strength", Range (0.01, 0.2)) = 1
    }
    SubShader

    {
        Cull Off
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
       
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
               
        Pass

        {

            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag

                struct v2f

                {
                    fixed4 color : COLOR;
                    fixed4 pos : SV_POSITION;
                    fixed2 pack0 : TEXCOORD0;
                    //fixed2 tc2         : TEXCOORD1;
                };
                sampler2D _MainTex;
                sampler2D _WiggleTex;
                fixed4 _MainTex_ST;
                fixed4 _Color;
                fixed _WiggleStrength;

                v2f vert(appdata_full v)

                {
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
                   
                    o.color = v.color;
                    return o;

                }
               
                fixed4 frag(v2f i) : COLOR
                {

                    fixed2 tc2 = i.pack0;
                    tc2.x -= _SinTime;
                    tc2.y += _CosTime;
                   
                    fixed4 wiggle = tex2D(_WiggleTex, tc2);
                   
                    fixed2 newUVtext = i.pack0;
                    newUVtext.x -= wiggle.r * _WiggleStrength;
                    newUVtext.y += wiggle.b * _WiggleStrength*1.5f;
                    //i.pack0.x -= wiggle.r * _WiggleStrength;
                    //i.pack0.y += wiggle.b * _WiggleStrength*1.5f;
                    //i.pack0.x = wiggle.r * _WiggleStrength;
                   
                    fixed4 c = tex2D(_MainTex,newUVtext) * i.color *_Color;
                    return c;

                }

            ENDCG

        }

    }

}
/*
        float2 tc2 = IN.uv_WiggleTex;
        tc2.x -= _SinTime;
        tc2.y += _CosTime;
        float4 wiggle = tex2D(_WiggleTex, tc2);
       
        IN.uv_MainTex.x -= wiggle.r * _WiggleStrength;
        IN.uv_MainTex.y += wiggle.b * _WiggleStrength*1.5f;
        */

 

Все меня в нем устраивает, но есть одно но - мне нужно чтобы прозрачность перекрываемых полигонов не складывалась а использовалась от ближнего к камере.
Как подобное реализовать?
Привожу также скрин ниже, верхушки волн получаются некрасивыми.
Заранее благодарю!
http://prntscr.com/9pb1dt
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 12 янв 2016, 23:18

Tags { "Queue"="Transparent+100" "IgnoreProjector"="True" "RenderType"="Transparent" }

//ZWrite Off
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Подправить шейдер 2D Water

Сообщение tarasevih 12 янв 2016, 23:33

waruiyume не помогло прозрачность полигонов складывается .
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 13 янв 2016, 02:37

Тогда попробовать в два пасса, первый, пишет только Z (Colormask 0), а второй, пишет всё кроме Z, и имеет смещение (Offset -1 -1 (насчёт знака не уверен)).
---------------
Да, такой вариант работает
Синтаксис:
Используется glsl
// Unlit
// Supports vertex color
// No lightmap
// Transparent



Shader "Water2D/Simple Water" {
    Properties

    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D ) = "white" {}
        _WiggleTex ("Base (RGB)", 2D) = "white" {}
                _WiggleStrength ("Wiggle Strength", Range (0.01, 0.2)) = 1
    }
    SubShader

    {
       
        Cull Off
        Tags { "Queue"="Transparent+500" "IgnoreProjector"="True" "RenderType"="Transparent" }
       
                ZWrite On
                Blend Off
                                Colormask 0
       
        Pass

        {

            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag

                struct v2f
                {
                    fixed4 pos : SV_POSITION;
                };

                //v2f vert(appdata_full v)
                v2f vert(fixed4 vertex : SV_POSITION)

                {
                    v2f o;
                                       
                                        float4 worldDispl = mul(_Object2World, vertex);
                                        worldDispl.y = worldDispl.y+sin(worldDispl.x+_Time.z)+cos(worldDispl.z+_Time.z);
                                       
                    o.pos = mul(UNITY_MATRIX_MVP, mul(_World2Object, worldDispl));

                    return o;

                }
               
                fixed4 frag(v2f i) : COLOR
                {
                    return 0;
                }

            ENDCG

        }
       
        Cull Off
        Tags { "Queue"="Transparent+500" "IgnoreProjector"="True" "RenderType"="Transparent" }
       
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
                                Colormask RGBA
                                Offset -1, -1
               
        Pass

        {

            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag

                struct v2f

                {
                    fixed4 color : COLOR;
                    fixed4 pos : SV_POSITION;
                    fixed2 pack0 : TEXCOORD0;
                    //fixed2 tc2         : TEXCOORD1;
                };
                sampler2D _MainTex;
                sampler2D _WiggleTex;
                fixed4 _MainTex_ST;
                fixed4 _Color;
                fixed _WiggleStrength;

                v2f vert(appdata_full v)

                {
                    v2f o;
                                       
                                        float4 worldDispl = mul(_Object2World, v.vertex);
                                        worldDispl.y = worldDispl.y+sin(worldDispl.x+_Time.z)+cos(worldDispl.z+_Time.z);
                                       
                    o.pos = mul(UNITY_MATRIX_MVP, mul(_World2Object, worldDispl));
                    o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
                   
                    o.color = v.color;
                    return o;

                }
               
                fixed4 frag(v2f i) : COLOR
                {

                    fixed2 tc2 = i.pack0;
                    tc2.x -= _SinTime;
                    tc2.y += _CosTime;
                   
                    fixed4 wiggle = tex2D(_WiggleTex, tc2);
                   
                    fixed2 newUVtext = i.pack0;
                    newUVtext.x -= wiggle.r * _WiggleStrength;
                    newUVtext.y += wiggle.b * _WiggleStrength*1.5f;
                   
                    fixed4 c = tex2D(_MainTex,newUVtext) * i.color *_Color;
                    return c;

                }

            ENDCG

        }

    }

}

 
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Подправить шейдер 2D Water

Сообщение tarasevih 13 янв 2016, 08:05

Так в роди работает, но мне не нужен displace по вертикали у меня скриптовые волны.
Да извиняюсь сразу не предупредил, что под андроид так что сразу вопрос о производительности?
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 13 янв 2016, 08:19

Синтаксис:
Используется glsl
// Unlit
// Supports vertex color
// No lightmap
// Transparent



Shader "Water2D/Simple Water" {
    Properties

    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D ) = "white" {}
        _WiggleTex ("Base (RGB)", 2D) = "white" {}
                _WiggleStrength ("Wiggle Strength", Range (0.01, 0.2)) = 1
    }
    SubShader

    {
       
        Cull Off
        Tags { "Queue"="Transparent+500" "IgnoreProjector"="True" "RenderType"="Transparent" }
       
                ZWrite On
                Blend Off
                                Colormask 0
       
        Pass

        {

            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag
                               
                struct v2f
                {
                    float4 pos : SV_POSITION;
                };

                v2f vert(fixed4 vertex : SV_POSITION)

                {
                    v2f o;
                                                                               
                    o.pos = mul(UNITY_MATRIX_MVP, mul(_World2Object, vertex));

                    return o;

                }
               
                fixed4 frag(v2f i) : COLOR
                {
                    return 0;
                }

            ENDCG

        }
       
        Cull Off
        Tags { "Queue"="Transparent+500" "IgnoreProjector"="True" "RenderType"="Transparent" }
       
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
                                Colormask RGBA
                                Offset -1, -1
               
        Pass

        {

            CGPROGRAM
                #include "UnityCG.cginc"
                #pragma vertex vert
                #pragma fragment frag

                struct v2f

                {
                    fixed4 color : COLOR;
                    fixed4 pos : SV_POSITION;
                    fixed2 pack0 : TEXCOORD0;
                    //fixed2 tc2         : TEXCOORD1;
                };
                sampler2D _MainTex;
                sampler2D _WiggleTex;
                fixed4 _MainTex_ST;
                fixed4 _Color;
                fixed _WiggleStrength;

                v2f vert(appdata_full v)

                {
                    v2f o;
                                                                       
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.pack0.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
                   
                    o.color = v.color;
                    return o;

                }
               
                fixed4 frag(v2f i) : COLOR
                {

                    fixed2 tc2 = i.pack0;
                    tc2.x -= _SinTime;
                    tc2.y += _CosTime;
                   
                    fixed4 wiggle = tex2D(_WiggleTex, tc2);
                   
                    fixed2 newUVtext = i.pack0;
                    newUVtext.x -= wiggle.r * _WiggleStrength;
                    newUVtext.y += wiggle.b * _WiggleStrength*1.5f;
                   
                    fixed4 c = tex2D(_MainTex,newUVtext) * i.color *_Color;
                    return c;

                }

            ENDCG

        }

    }

}

 
 


андроид так что сразу вопрос о производительности?

ХЗ
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Подправить шейдер 2D Water

Сообщение tarasevih 13 янв 2016, 12:51

Нет так как было осталось!Но что самое интересное при анимации в шейдере было нормально,
а как только вершины начал скриптом дергать все как было опять.
Ниче не пойму.
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 13 янв 2016, 20:56

Если вода это несколько отдельных мешей, то придётся придумывать что-то другое, т.к. Transparent объекты рисуются начиная с дальних. Можно попробовать рисовать все кусочки воды в два захода, через Graphics.DrawMesh, наверно, из OnPostRender(). Сначала 0 пасом, а потом первым.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Подправить шейдер 2D Water

Сообщение tarasevih 14 янв 2016, 07:33

Да вода из нескольких мешей, но они расположены в ряд перед камерой на одном расстояние так как игра 2.5d.
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 14 янв 2016, 07:49

Что значит вряд? Вы бы скриншот показали.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Подправить шейдер 2D Water

Сообщение tarasevih 14 янв 2016, 07:59

Я пробовал только что даже одним мешем все тоже самое.
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение tarasevih 14 янв 2016, 19:51

Блин так и не понял в чем проблема со скриптовыми волнами.
Вот решил прикрепить исходник с тремя вариантами волн, может так понятней будет?
У вас нет доступа для просмотра вложений в этом сообщении.
tarasevih
UNец
 
Сообщения: 31
Зарегистрирован: 13 апр 2014, 08:26

Re: Подправить шейдер 2D Water

Сообщение waruiyume 15 янв 2016, 02:39

Если на всех будет этот шейдер то останется только пересечение между разными объектами, для которого я описал возможное решение, но протестировать сейчас не могу.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Shader Lab

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

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