Подскажите как подобное реализовать

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

Подскажите как подобное реализовать

Сообщение Valter 18 апр 2011, 18:21

Доброго времени суток.
Скажите пожалуйста, эффект в этой игре: http://www.youtube.com/watch?v=szvjTSBYn58 с розами (при клике на розу, становиться полупрозрачной и только очертания видны, начинается с 53 секунды ролика), как его реализовать (уж очень понравился). Я в шейдерах не силен, поэтому прошу подсказать с чего начать, куда копать, алгоритм в конце концов. Возможно название техники реализации. Вообще с чего бы Вы начали?
Буду Вам очень признателен.
С уважением Андрей.
Valter
UNец
 
Сообщения: 33
Зарегистрирован: 12 янв 2011, 18:51

Re: Подскажите как подобное реализовать

Сообщение Paul Siberdt 18 апр 2011, 18:52

Это блендинг двух текстур по маске. Маска строится, например, из альфа-канала одной из текстур через выборку по альфа-тесту. Параметр альфа-теста изменяется во времени, каждый раз формируя новый срез блендинга.
Конечно, эффект можно реализовать еще несколькими способами, но альфа-тестовый блендинг, думаю, самое несложное.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Подскажите как подобное реализовать

Сообщение Valter 18 апр 2011, 20:20

Спасибо. Попробую сделать. Значит все подобные эффекты делаются смешивание текстур? (по каналам).
Последний раз редактировалось Valter 19 апр 2011, 23:02, всего редактировалось 1 раз.
Valter
UNец
 
Сообщения: 33
Зарегистрирован: 12 янв 2011, 18:51

Re: Подскажите как подобное реализовать

Сообщение Paul Siberdt 18 апр 2011, 20:39

Начинаем, например, отсюда и пошло-поехало :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Подскажите как подобное реализовать

Сообщение Valter 21 апр 2011, 15:00

Здравствуйте, вот нашёл время, сделал шейдер, но он у меня делает не, то что я хотел, вот шейдер:
Синтаксис:
Используется csharp
Shader "Texture Blending" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _Tex2 ("Base (RGB)", 2D) = "white" {}
                //_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
        }
        SubShader {
       
                Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
                LOD 200
                Pass {
                       
                        CGPROGRAM
#pragma exclude_renderers gles
                                #pragma fragment frag
                                #include "UnityCG.cginc"
                                struct v2f {
                                        float4 pos : SV_POSITION;
                                        float2 uv : TEXCOORD0;
                                        float3 color : COLOR;
                                };
                                uniform sampler2D _MainTex;
                                uniform sampler2D _Tex2;
                                uniform float4 _Color;
                                float4 frag(v2f i) : COLOR
                                {
                                float4 texcol = tex2D(_MainTex, i.uv);
                                float4 texcol2 = tex2D(_Tex2, i.uv);
                                texcol=float4(texcol2.rgb*texcol.a*sin(_Time),1);
                                return texcol;
                                }
                        ENDCG
                }
        }
        FallBack "Transparent"
}

Я хочу, чтобы текстура переходила из одной в другую. Видимо я не понимаю как наложить маску. Ещё вопрос вдогонку как мне добиться такого же эффекта как в шейдере Particles/Additive (Soft). В смысле чтобы текстура стала прозрачной, не было видно фона.
Заранее благодарю.
Valter
UNец
 
Сообщения: 33
Зарегистрирован: 12 янв 2011, 18:51

Re: Подскажите как подобное реализовать

Сообщение Battle Angel Alita 21 апр 2011, 15:34

как-то так
Синтаксис:
Используется glsl
Shader "lll"
{
        Properties
        {
                _MainTex ("Front(RGBA)", 2D) = "white" {}
                _Tex2 ("Back (RGBA)", 2D) = "white" {}
                _t ("t", Range(0.0, 1.0)) = 0.05
        }
       
        SubShader
        {
                Tags {"RenderType"="Transparent" "Queue"="Transparent"}
               

CGPROGRAM
#pragma surface surf Lambert alpha


uniform sampler2D _MainTex;
uniform sampler2D _Tex2;
uniform float _t;


struct Input
{
        float2 uv_MainTex;
        float2 uv_Tex2;
};


void surf(Input IN, inout SurfaceOutput o)
{
        float4 tex2 = tex2D(_Tex2, IN.uv_Tex2);
        float4 maintex = tex2D(_MainTex, IN.uv_MainTex);
        //maintex.a = (maintex.a - sin(_Time)) * 100500.0;
        maintex.a = (maintex.a - _t) * 100500.0;
        maintex.a = saturate(maintex.a);

        o.Alpha = lerp(tex2.a, 1.0, maintex.a);
        o.Albedo = lerp(tex2.rgb, maintex.rgb, maintex.a);
}
ENDCG


        }
FallBack "Transparent/Diffuse"
}
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Подскажите как подобное реализовать

Сообщение Valter 21 апр 2011, 17:28

Battle Angel Alita благодарю.
Скажите пожалуйста на чём основывается Ваша логика, почему здесь :
maintex.a = (maintex.a - _t) * 100500.0;
Вы умножили число на 100500.0 с чем это связано?
И как я понял это:
o.Alpha = lerp(tex2.a, 1.0, maintex.a);
o.Albedo = lerp(tex2.rgb, maintex.rgb, maintex.a);
Линейная интерполяция, но плавного перехода не происходит, а лишь скачок при изменении параметра _t с одной текстуры на другую.
Прозрачности тоже не появилось. Для наглядности, чтобы можно было посмотреть на одних и тех же данных создал пакет весит 103 кб, скачать можно отсюда: http://auto-world.uz/unity/texture_blend.unitypackage
Valter
UNец
 
Сообщения: 33
Зарегистрирован: 12 янв 2011, 18:51

Re: Подскажите как подобное реализовать

Сообщение DbIMok 21 апр 2011, 17:52

насколько я понимаю, это шаблон-набросок, пинок в правильном направлении. его нужно "допилить" по вкусу. "стопиццот" на это недвусмысленно указывает. вот на основе его и разберитесь/допишите как вам нужно.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Подскажите как подобное реализовать

Сообщение Battle Angel Alita 21 апр 2011, 18:30

>Скажите пожалуйста на чём основывается Ваша логика, почему здесь :
>maintex.a = (maintex.a - _t) * 100500.0;
>Вы умножили число на 100500.0 с чем это связано?

это такой олдовый способ бинаризировать значение. типа if(maintex.a > _t) then maintex.a = 1.0 else maintex.a = 0.0. в принципе умножать можно на маленькие значения вроде 5-10, тогда переход будет чуть плавный.

>плавного перехода не происходит, а лишь скачок
>Прозрачности тоже не появилось.

естественно, на твоих текстурах нету альфа канала. вот примерно какие текстуры надо делать для такого шейдера -
rose.unitypackage
У вас нет доступа для просмотра вложений в этом сообщении.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Подскажите как подобное реализовать

Сообщение Valter 21 апр 2011, 21:40

Battle Angel Alita Большое спасибо, действительно дело в текстурах.
P.S. Вы не обижайтесь на меня, я с графикой недавно начал работать. Понимаю что с такими вещами не стоит лезть на форумы. Просто катастрофически времени не хватает всё изучить, по мере возможности читаю. Ещё раз благодарю.
Valter
UNец
 
Сообщения: 33
Зарегистрирован: 12 янв 2011, 18:51


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

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

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