Миникарта. Текстура по маске (Rounded minimap)

Программирование на Юнити.

Миникарта. Текстура по маске (Rounded minimap)

Сообщение jeyson 23 сен 2009, 14:06

Хочу поделиться находкой http://forum.unity3d.com/viewtopic.php?t=12427&highlight=gui+mask
Там находится шейдер (2-я страница и последний пост Protona) позволяющий выводить текстуру по маске а так же её поворачивать. Но там все для крутящегося компаса.
А наша задача - миникарта: зум карты, перемещение, и вращение. Поэтому немного добавив строк в шейдер получилось следущее:
Код: Выделить всё
Shader "Rounded MiniMap" {
   Properties {
      _MainTex ("Base (RGB)", 2D) = "white" {}
      _MaskTex ("Mask (RGB)", 2D) = "white" {}
      _Rotation ("Rotation", Range (-3.14, 3.14)) = 0.0
      _MoveX ("Move X", Range (0,1)) = 0.5
      _MoveY ("Move Y", Range (0,1)) = 0.5
      _Scale ("Scale", Range (1,10)) = 1.0
   }
   SubShader {
     
      Tags {Queue=Transparent}
      Lighting Off
      ColorMask RGB
     
     
      Pass {  //+1 draw call можно закоментить, немного повлияет на текстуру
         blend Zero OneMinusSrcColor
         SetTexture [_MaskTex] {
            Combine texture
         }
      }
     
     
      Pass {
     
         blend One OneMinusSrcColor
         
           
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct v2f {
    V2F_POS_FOG;
    float2  uv : TEXCOORD0;
    float2  uv2 : TEXCOORD1;
};

uniform float4 _MainTex_ST;
uniform float4 _MaskTex_ST;
uniform float _Rotation;
uniform float _MoveX;
uniform float _MoveY;
uniform float _Scale;

v2f vert (appdata_base v)
{
    v2f o;
    PositionFog( v.vertex, o.pos, o.fog );
    float2 uv1 = TRANSFORM_TEX(v.texcoord, _MainTex);
    o.uv2 = TRANSFORM_TEX(v.texcoord, _MaskTex);

   uv1 -= float2( 0.5, 0.5 );
   o.uv.x =  cos( _Rotation )*uv1.x + sin(_Rotation)*uv1.y;
   o.uv.y = -sin( _Rotation )*uv1.x + cos(_Rotation)*uv1.y;
   o.uv += float2(_MoveY*_Scale, _MoveX*_Scale);
   o.uv /= _Scale;

    return o;
}

uniform sampler2D _MainTex;
uniform sampler2D _MaskTex;

half4 frag (v2f i) : COLOR
{
   half4 mainCol = tex2D( _MainTex, i.uv );
   half4 maskCol = tex2D( _MaskTex, i.uv2 );
   
   return mainCol * maskCol;
}
ENDCG

      }

     
   }
}

Для чуда надо текстуру и чернобелую маску, где текстура будет накладываться на белый цвет.

1.png

2.png
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Миникарта. Текстура по маске (Rounded minimap)

Сообщение gnoblin 23 сен 2009, 14:15

:ymdaydream:

Еще была мысль сделать круглый меш и на нем скролить\поворачивать текстуру ~o) .
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Миникарта. Текстура по маске (Rounded minimap)

Сообщение fox 23 сен 2009, 14:39

:-bd
Добавить foxumkov в Skype
Мои проекты:
Turbodrive
Изображение

Изображение
Аватара пользователя
fox
UNITрон
 
Сообщения: 255
Зарегистрирован: 07 ноя 2008, 13:02
Откуда: Питер
  • ICQ

Re: Миникарта. Текстура по маске (Rounded minimap)

Сообщение iqubik 26 сен 2009, 11:21

Спасибо за это решение!
Как шейдер прекрасно работает.
Но не могли бы вы описать процесс обращения к параметрам шейдера, или что лучше выложить ассет с демосценой и подключённой картой.
Я, да и многие были бы вам очень благодарны.
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: Миникарта. Текстура по маске (Rounded minimap)

Сообщение jeyson 27 сен 2009, 01:25

как обращаться к параметрам шейдера: http://unity3d.com/support/documentation/ScriptReference/Material.SetFloat.html
в нашем случае например чтобы повернуть текстуру, проделываем следущее:
Код: Выделить всё
function Update () {
float rotate = Mathf.PingPong (Time.time, 1.0f);
renderer.material.SetFloat( "_Rotation", rotate );
}
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Миникарта. Текстура по маске (Rounded minimap)

Сообщение iqubik 27 сен 2009, 20:20

jeyson писал(а):как обращаться к параметрам шейдера: http://unity3d.com/support/documentation/ScriptReference/Material.SetFloat.html
в нашем случае например чтобы повернуть текстуру, проделываем следущее:
Код: Выделить всё
function Update () {
float rotate = Mathf.PingPong (Time.time, 1.0f);
renderer.material.SetFloat( "_Rotation", rotate );
}

Спасибо. К шейдеру понял как обращаться, но миникарту вот так вот с наскока реализовать не удалось.
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ


Вернуться в Скрипты

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

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