Вторник, 26 Ноября 2024, 17:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Можно ли изменить текстуру спрайта, не указывая другой?
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, почему-то эта строка в шейдере не работает)

Код

o.Alpha = c.a;

ибо альфы вообще нет в спрайте, но всё равно спасибо, жаль я не шарю в шейдерах ничего(
загуглил другие шейдеры, было много примеров, но нормального так и не нашёл.
Во многих примерах почему-то тоже альфа выглядит не работающей, может это из-за того что шейдер писался для
старой юнити, к примеру, или еще что-то.
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
старожил
Сейчас нет на сайте
а, ну я просто мобилы вообще не рассматриваю как платформу для игр :D а так да, там жестко
alexsilentДата: Понедельник, 05 Марта 2018, 16:50 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата BrightSpot ()
Альфа в выходящем пикселе = альфа в Первой текстуре(спрайте), то есть нет альфы в первой текстуре - нет и на выходе

проблема в том , что на обоих текстурах есть альфа, но ни одну он не видит)
даже пробовал менять код на
Код

o.Alpha = m.a;

но тоже прозрачности вообще нет, как будто без альфы на выходе



PS Видимо в юнити еще куча проблем с совместимостью, если этот шейдер на других компах показывается с альфой, нормально. У меня ноутбук , кстати.

Добавлено (05 Марта 2018, 16:50)
---------------------------------------------
На обычном квадратном меше это смотрится вдвойне странно, ибо оранжевая линия говорит о том, что это края материала при выборе, но прозрачности за краями нету.



Сообщение отредактировал alexsilent - Понедельник, 05 Марта 2018, 16:50
OtinagiДата: Вторник, 06 Марта 2018, 08:37 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
У меня похожее было, когда текстурка на импорт в Юнити была настроена без прозрачности.

«Смерти меньше всего боятся те люди, чья жизнь имеет наибольшую ценность.»
Иммануил Кант
BrightSpotДата: Понедельник, 12 Марта 2018, 11:27 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
я писал:"за код не ручаюсь - не тестил"... мог и напартачить... если что, на работе соберу рабочий вариант и отпишусь :D

Добавлено (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
  }
    }
}



Более мощный компьютер глючит быстрее и точнее.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг