Страницы

Поиск по вопросам

понедельник, 2 марта 2020 г.

Как можно добиться эффекта плавного перехода между фоном и объектом в Unity?

#c_sharp #unity3d


Не знаю как это называется правильно Gradient Fade-In или как-то по-другому , поэтому
к примеру прикрепил изображения что я хочу получить 





UPD:
@test123 Ваш шейдер странно себя ведет, меняет цвет моей платформи и не работает
этот переход как нужно

Мой объект


Ваш шейдер


UPD 2:
Это то что нужно получить на финале 

    


Ответы

Ответ 1



Попытаюсь показать, как бы это сделал на шейдерах я: Нам необходимо ввести текстуру и цвет, чтобы вы полноценно смогли работать с материалом объекта в дальнейшем. Объекты могут быть разными по высоте, значит нам надо ввести какой то коэффициент для каждого объекта, описывающий его высоту. Введём коэффициент прозрачности, который будет показывать с какой скоростью исчезает объект с места перехода. Properties { _MainTex ("Albedo Texture", 2D) = "white" {} _TintColor("Tint Color", Color) = (1,1,1,1) _Transparency("Transparency", Range(0.0,1)) = 1 _Height("Height", Range(0,100)) = 1 } Далее, указываем что нас интерисует альфа как объекта, так и текстуры: Tags {"Queue"="Transparent" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha Теперь объявляем с чем мы имеем дело (vert и frag функции): #pragma vertex vert #pragma fragment frag Далее, простейшие операции: struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _TintColor; float _Transparency; float _Height; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; return col; } Создаю сцену, и делаю материалы Теперь, так как у вертексов нет понятия "Bounds", то есть, мы не можем узнать, размеры меша (расстояние между двумя самыми дальними вершинами) по необходимой плоскости, мы воспользуемся пунктом 2, и проследим за нашей переменной, немного модефицируя шейдер: fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; if(i.vertex.y<_Height){ col = fixed4(1,0,0,1); } return col; } На моём примере видна граница, которая нас интересует - эта граница будет показывать, откуда нам начинать прятать объект: Делаем очередную модификацию кода: fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _TintColor; if(i.vertex.y<_Height){ float y = i.vertex.y; col.a = 1-_Transparency*(_Height-y); } return col; } Чтобы менять альфу относительно текущей высоты точки на экране, и подкручиваем параметр прозрачности _Transparency: В итоге, я получил результат для материала группы одинаковых объектов: Полный листинг шейдера можно посмотреть тут Вот готовый вариант по uv: Shader "Custom/Test" { Properties { _MainTex ("Texture", 2D) = "white" { } _Height ("Height", float) = 0 _Transparent ("Transparent", Range(0,2)) = 0 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha LOD 100 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; }; sampler2D _MainTex; float4 _MainTex_ST; float _Height; float _Transparent; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float y = i.uv.y; if(y<_Height){ col.a = 1-_Transparent*(_Height-y); } return col; } ENDCG } } }

Комментариев нет:

Отправить комментарий