Можно ли изменить текстуру спрайта, не указывая другой?
| |
alexsilent | Дата: Среда, 28 Февраля 2018, 18:43 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| 2D игра. Делаю кастомизацию персонажей и задумался Можно ли изменить текстуру спрайта, не указывая другой спрайт, а лишь другую картинку, которая не обязательно была поделена на спрайты? То есть, обычно меняют спрайты через sprite, а если ли доступ к самой текстуре, я хочу поменять её, не меняя спрайт? Это нужно для автоматического изменения к примеру грязности одежды, или она будет более рваная, если делать с плоским мешем, то текстуру поменять очень просто, но для спрайтов, я не уверен возможно ли, или тогда придётся использовать действительно плоские меши Quad. А если вручную это все делать: 1) распиливать картинки на спрайты для каждого набора изменений одежды 2) указывать какой конкретно спрайт должен быть в каком режиме уровня "грязности" или "рваности" задействован, короче куча мороки, потому-что в юнити нет возможность выбирать спрайт по имени, как это было можно в TK2D
Добавлено (28 Февраля 2018, 18:43) --------------------------------------------- По хорошему надо всего лишь, какой-то шейдер с 3-мя слоя спрайта, с альфа маской и грязнотой, меняя силу обоих, но о таком чуде я даже мечтать и спрашивать боюсь)) вряд ли такое есть
Сообщение отредактировал alexsilent - Среда, 28 Февраля 2018, 19:02 |
|
| |
BrightSpot | Дата: Среда, 28 Февраля 2018, 22:45 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Цитата alexsilent ( ) То есть, обычно меняют спрайты через sprite, а если ли доступ к самой текстуре, я хочу поменять её, не меняя спрайт? Спрайт можно создать из текстуры:
Код Sprite _newSprite = Sprite.Create(Texture, Rect);
Цитата alexsilent ( ) потому-что в юнити нет возможность выбирать спрайт по имени, как это было можно в TK2D не соглашусь... Делаешь какой нить "SpriteManager"(скрипт) в нем:
Код public List<Sprite> _spriteList;//Сюда пихаешь спрайты через инспектор Dictionary<string, Sprite> _spriteDictionary = new Dictionary<string, Sprite>();
void Start() { foreach(var item in _spriteList) { if(!_spriteDictionary.ContainsKey(item.name)) { _spriteDictionary.Add(item.name, item); } }
public Sprite GetSprite(string _name)//тут вытягиваешь по имени спрайта { return (_spriteDictionary.ContainsKey(_name))? _spriteDictionary[_name]: null; }
Цитата alexsilent ( ) По хорошему надо всего лишь, какой-то шейдер с 3-мя слоя спрайта, с альфа маской и грязнотой, меняя силу обоих, но о таком чуде я даже мечтать и спрашивать боюсь)) Смешивание 2-х спрайтов по значению:
Код Shader "Custom/MainShader" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _MainTex2 ("Mask (RGB)", 2D) = "white" {} _Value ("Value", Range(0,1)) = 0.0 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" }
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
sampler2D _MainTex; sampler2D _MainTex2; half _Value;
struct Input { float2 uv_MainTex; float2 uv_MainTex2; };
void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex); fixed4 m = tex2D (_MainTex2, IN.uv_MainTex2);
o.Albedo = lerp(c,m,_Value); o.Alpha = c.a; }
ENDCG } FallBack "Diffuse"
P.S За синтаксис не ручаюсь - по памяти писал
Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Среда, 28 Февраля 2018, 23:12 |
|
| |
alexsilent | Дата: Суббота, 03 Марта 2018, 14:56 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| Ого! Спасибо за столь развёрнутый ответ!! *__* Добавлено (03 Марта 2018, 14:56) --------------------------------------------- BrightSpot, почему-то эта строка в шейдере не работает)
ибо альфы вообще нет в спрайте, но всё равно спасибо, жаль я не шарю в шейдерах ничего( загуглил другие шейдеры, было много примеров, но нормального так и не нашёл. Во многих примерах почему-то тоже альфа выглядит не работающей, может это из-за того что шейдер писался для старой юнити, к примеру, или еще что-то.
|
|
| |
BrightSpot | Дата: Суббота, 03 Марта 2018, 16:34 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Цитата alexsilent ( ) почему-то эта строка в шейдере не работает) Альфа в выходящем пикселе = альфа в Первой текстуре(спрайте), то есть нет альфы в первой текстуре - нет и на выходе... если нужно альфу взять через цвет подложки то можно заюзать "if" - но такое может подтормаживать... я сам недавно занялся шейдерами еще не все знаю...
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
drcrack | Дата: Суббота, 03 Марта 2018, 17:51 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Цитата если нужно альфу взять через цвет подложки то можно заюзать "if" - но такое может подтормаживать... Популярное мнение, но не очень актуальное особенно для легких спрайтов Вообще этому шейдеру if не нужен, но можешь протестить два варианта и никакой разницы в фпс не увидишь)
|
|
| |
BrightSpot | Дата: Суббота, 03 Марта 2018, 21:03 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Цитата drcrack ( ) Популярное мнение, но не очень актуальное особенно для легких спрайтов для мобил слабого уровня очень актуально, особенно на больших "площадях"... на тестах "туман войны" по маске на глобальную карту, ронял 5-10фпс на 1 if... Хотя на мобилах вообще много заморочек с просадками фпс и шейдеры не самое плохое=)Добавлено (03 Марта 2018, 21:03) --------------------------------------------- Ну а если на комп делать, то нужно еще постараться... (не учел компы, вот и предупредил о просадках)
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
drcrack | Дата: Суббота, 03 Марта 2018, 21:29 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| а, ну я просто мобилы вообще не рассматриваю как платформу для игр а так да, там жестко
|
|
| |
alexsilent | Дата: Понедельник, 05 Марта 2018, 16:50 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Цитата BrightSpot ( ) Альфа в выходящем пикселе = альфа в Первой текстуре(спрайте), то есть нет альфы в первой текстуре - нет и на выходе проблема в том , что на обоих текстурах есть альфа, но ни одну он не видит) даже пробовал менять код на
но тоже прозрачности вообще нет, как будто без альфы на выходе
PS Видимо в юнити еще куча проблем с совместимостью, если этот шейдер на других компах показывается с альфой, нормально. У меня ноутбук , кстати.
Добавлено (05 Марта 2018, 16:50) --------------------------------------------- На обычном квадратном меше это смотрится вдвойне странно, ибо оранжевая линия говорит о том, что это края материала при выборе, но прозрачности за краями нету.
Сообщение отредактировал alexsilent - Понедельник, 05 Марта 2018, 16:50 |
|
| |
Otinagi | Дата: Вторник, 06 Марта 2018, 08:37 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| У меня похожее было, когда текстурка на импорт в Юнити была настроена без прозрачности.
«Смерти меньше всего боятся те люди, чья жизнь имеет наибольшую ценность.» Иммануил Кант
|
|
| |
BrightSpot | Дата: Понедельник, 12 Марта 2018, 11:27 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| я писал:"за код не ручаюсь - не тестил"... мог и напартачить... если что, на работе соберу рабочий вариант и отпишусь Добавлено (12 Марта 2018, 11:27) --------------------------------------------- вот варриант смешения спрайта с текстурой - альфу учитывает, но нужно соблюдать uv -коорды от спрайта...
Код Shader "Unlit/ssss" { Properties { [PerRendererData] _MainTex ("Texture", 2D) = "white" {} _MainTex2("Texture2", 2D) = "white" {} _Value("Value", Range(0,1)) = 0.0 } SubShader { Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" } Cull Off Lighting Off ZWrite Off Fog{ Mode Off } Blend One OneMinusSrcAlpha
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; sampler2D _MainTex2; float4 _MainTex2_ST; float _Value;
v2f vert (appdata v) { v2f OUT; OUT.vertex = UnityObjectToClipPos(v.vertex); OUT.uv = v.uv; return OUT; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); fixed4 col2 = tex2D(_MainTex2, i.uv); col2.rgb *= col2.a; fixed3 colr = lerp(col.rgb, col2.rgb, _Value); col.rgb = colr.rgb * col.a; return col; } ENDCG } } }
Более мощный компьютер глючит быстрее и точнее.
|
|
| |
|