Как повысить яркость спрайта

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как повысить яркость спрайта

Сообщение Pro 21 июн 2018, 02:17

Как сделать что бы цвет указанный в SpriteRenderer не помножался на цвет текстуры, а прибавлялся? Что бы получить эффект повышения яркости?
В старом движке делалось выставлением BLEND_COLORADD у спрайта
"The vertex color is added to a texture's texel colors, resulting in texture lightening. The vertex color 0x00000000 makes no effect."

Без шейдеров тут не обойтись? Если да, то какой нужен? И чтоб был оптимизирован под мобилу. Находил шейдер который просто делает светлым спрайт, без возможности плавно менять уровень яркости.
Pro
UNец
 
Сообщения: 22
Зарегистрирован: 27 май 2018, 11:19

Re: Как повысить яркость спрайта

Сообщение waruiyume 21 июн 2018, 08:00

Синтаксис:
Используется glsl
Shader "Sprites/Add"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
        [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
        [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
        [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", 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 SpriteVert
            #pragma fragment AddSpriteFrag
            #pragma target 2.0
            #pragma multi_compile_instancing
            #pragma multi_compile _ PIXELSNAP_ON
            #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
            #include "UnitySprites.cginc"
                       
                        fixed4 AddSpriteFrag(v2f IN) : SV_Target
                        {
                                fixed4 c = SampleSpriteTexture (IN.texcoord) + IN.color;
                                c = saturate(c);
                                c.rgb *= c.a;
                                return c;
                        }
        ENDCG
        }
    }
}
 

Встроенные шейдеры для ковыряния качать здесь:
https://unity3d.com/ru/get-unity/download/archive
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как повысить яркость спрайта

Сообщение Pro 21 июн 2018, 08:51

Спасбо, буду пробовать.
А я нашел еще такой, он лучше или хуже? (в плане производительности под мобилу)

Синтаксис:
Используется glsl
Shader "Sprites/Diffuse Flash Illuminating"
{
        Properties
        {
                [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
                _FlashAmount ("Flash Amount",Range(0.0,1.0)) = 0.0
                _Color ("Tint", Color) = (1,1,1,1)
                [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        }

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

                Cull Off
                Lighting Off
                ZWrite Off
                Fog { Mode Off }
                Blend SrcAlpha OneMinusSrcAlpha

                CGPROGRAM
                #pragma surface surf Lambert alpha vertex:vert
                #pragma multi_compile DUMMY PIXELSNAP_ON

                sampler2D _MainTex;
                fixed4 _Color;
                float _FlashAmount;
               
                struct Input
                {
                        float2 uv_MainTex;
                        fixed4 color;
                };
               
                void vert (inout appdata_full v, out Input o)
                {
                        #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
                        v.vertex = UnityPixelSnap (v.vertex);
                        #endif
                        v.normal = float3(0,0,-1);
                       
                        UNITY_INITIALIZE_OUTPUT(Input, o);
                        o.color = _Color;
                }

                void surf (Input IN, inout SurfaceOutput o)
                {
                        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
                        o.Albedo = lerp(c.rgb,float3(1.0,1.0,1.0),_FlashAmount);
                        o.Emission = lerp(0.0,float3(1.0,1.0,1.0),_FlashAmount);
                        o.Alpha = c.a;
                }
                ENDCG
        }

Fallback "Transparent/VertexLit"
}
 
Pro
UNец
 
Сообщения: 22
Зарегистрирован: 27 май 2018, 11:19

Re: Как повысить яркость спрайта

Сообщение waruiyume 21 июн 2018, 09:02

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

Re: Как повысить яркость спрайта

Сообщение Pro 02 июл 2018, 04:55

Извините, только сейчас вернулся к игре.

Но как использовать ваш шейдер?
По краям обьекта за место прозрачности выводятся какие то артефакты. Как я понял, это потому, что ваш шейдер использует внешнюю альфу. А как обычные спрайты использовать, где альфа канал в самой текстуре?

И что вы имели ввиду говоря про ковыряние шейдеров, дав ссылку на устаревшие версии юнити. Т.е. ваш шейдер использует устаревшую функцию SampleSpriteTexture из других версий юнити?

И еще вопрос, как применять яркость для каждого отдельного спрайта? Настройки шейдера применяются ко всем спрайтам. Как сделать, что бы 100 объектов имели свой уровень яркости/оттенка и плавно его меняли? Не создавать ведь 100 материалов?
Pro
UNец
 
Сообщения: 22
Зарегистрирован: 27 май 2018, 11:19

Re: Как повысить яркость спрайта

Сообщение Cr0c 02 июл 2018, 10:33

Если кодом - то материал проперти блок использовать из материала объекта. Батчинг всё равно сломается, но хоть не будет по материалу на объект.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Как повысить яркость спрайта

Сообщение waruiyume 02 июл 2018, 12:36

Чтобы не было артефактов нужно не складывать альфу а умножить.
Синтаксис:
Используется glsl
fixed4 AddSpriteFrag(v2f IN) : SV_Target
                        {
                                fixed4 c = SampleSpriteTexture (IN.texcoord);
                                c.rgb += IN.color.rgb;
                                c.rgb = saturate(c.rgb);
                                c.a*=IN.color.a;
                                c.rgb *= c.a;
                                return c;
                        }
 

дав ссылку на устаревшие версии юнити

Это 2018.1.6 устаревшая, Макфлай, убирайся туда откуда прибыл!

как применять яркость для каждого отдельного спрайта

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

Re: Как повысить яркость спрайта

Сообщение Cr0c 02 июл 2018, 13:25

waruiyume писал(а):Чтобы не было артефактов нужно не складывать альфу а умножить

Может ему засветка нужна? Можно и складывать, только клампить не забыть.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Как повысить яркость спрайта

Сообщение Pro 02 июл 2018, 14:57

Поменял код и меняю цвет у spriterenderer - теперь всё ок.
А раз tint бесполезный, его можно из расчетов исключить чтоб лишние вычисления не делались?
Pro
UNец
 
Сообщения: 22
Зарегистрирован: 27 май 2018, 11:19

Re: Как повысить яркость спрайта

Сообщение waruiyume 02 июл 2018, 15:27

его можно из расчетов исключить

Не всё так просто. Если вы сотрёте свойство "_Color ("Tint", Color) = (1,1,1,1)", то просто уберёте возможность менять его из инспектора материала, чтобы убрать вычисления, вам нужно скачать стандартные шейдеры, найти инклуд в котором находится "SpriteVert", скорее всего это "UnitySprites.cginc", скопировать листинг "SpriteVert" из него, удалить использование тинта, и использовать свой вариант вместо "#pragma vertex SpriteVert".
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как повысить яркость спрайта

Сообщение Cr0c 02 июл 2018, 17:55

waruiyume писал(а):Чтобы не было артефактов нужно не складывать альфу а умножить

Альфа же как в аддитивном блендинге смешивается?
Синтаксис:
Используется glsl
Result = Alpha1 + Alpha2 *(1 - Alpha1);
 
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Как повысить яркость спрайта

Сообщение waruiyume 02 июл 2018, 18:22

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

Re: Как повысить яркость спрайта

Сообщение Cr0c 02 июл 2018, 19:11

waruiyume писал(а):Чтобы не было артефактов нужно не складывать альфу а умножить.

waruiyume писал(а):Не понимаю, к чему вы это?

Я к умножению альфы. А вообще, трогать альфу не надо, только rgb компонент множить. Здесь же не маска подмешивается, а только значимый цвет.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81


Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 26