Как заставить исчезать обьекты при приближении их к камере

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

Как заставить исчезать обьекты при приближении их к камере

Сообщение pak 17 сен 2009, 11:21

Вопрос следующий: Есть плоскости кубики и прочая геометрия которую необходимо по мере приближения к камере зделать прозрачной, чем блмже к камере тем прозрачней обьект становится. Как это можно зделать припомощи скрипта или матерьяла?

Я так думаю необходимо написать "Transparent" шейдер который бы изменял альфа канал текстуры или матерьяла при изменении расстояния от камеры обьекта...
ЭЭЭ но я чето пока слабо в это разбираюсь!
pak
UNец
 
Сообщения: 8
Зарегистрирован: 17 сен 2009, 10:22

Re: Как заставить исчезать обьекты при приближении их к камере

Сообщение ffinder 17 сен 2009, 13:31

Нужно написать скрипт, который в функции OnWillRenderObject будет рассчитывать расстояние до камеры и исходя из этого расстояния - прозрачность.
И создать материал, прозрачность которого регулируется Alpha-компонентой цвета. В качестве шейдера взять нужный из подгруппы Transparent.
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Как заставить исчезать обьекты при приближении их к камере

Сообщение Const_47 17 сен 2009, 14:21

Код: Выделить всё
Shader "Const_47/DistanceOpacity" {
   Properties {
   
       _Color("MainColor",Color) = (1,1,1,1)
      _Distance("Distance", Range (0, 200)) = 100
      
                 }

Category {


    Tags {"Queue" = "Transparent"}
    Alphatest Greater 0
   
   
   ColorMask RGB
   Fog { Color [_AddFog] }
   SubShader {
   
   Pass {
   Tags {"LightMode" = "Always"}
    Blend SrcAlpha OneMinusSrcAlpha   

//
   
////////////////////////////////////////AmbientPass/////////////////////////////////////////////
          CGPROGRAM
         
    #pragma vertex vert
    #pragma fragment frag
    #include "UnityCG.cginc"

struct appdata {
    float4 vertex : POSITION;
};

struct v2f {
   V2F_POS_FOG;
   float4 color : COLOR;
   float3 viewV : TEXCOORD0;
};

uniform float4 _Color;
uniform float _Distance;

v2f vert (appdata v)
{   
   v2f o;
   PositionFog( v.vertex, o.pos, o.fog );
   o.viewV = ObjSpaceViewDir( v.vertex );
   return o;
}

float4 frag (v2f i) : COLOR
{      
   float4 final = _Color;
   final.a = saturate(length(i.viewV)/_Distance);
   return final;   
}
ENDCG 
    }
   
   }
}
FallBack "Diffuse", 1
}
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Как заставить исчезать обьекты при приближении их к камере

Сообщение ffinder 17 сен 2009, 20:37

(3A4OT)
ЗЫ: жаль на fallback`е diffuse shader
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Как заставить исчезать обьекты при приближении их к камере

Сообщение pak 29 сен 2009, 12:29

Че то при добавлении текстуры не работает. _MainTex ("Base (RGB)", 2D) = "white" {} и тд - просто текстура без прозрачности получается
pak
UNец
 
Сообщения: 8
Зарегистрирован: 17 сен 2009, 10:22

Re: Как заставить исчезать обьекты при приближении их к камере

Сообщение pak 29 сен 2009, 12:54

ооо получилось

Код: Выделить всё
Shader "Transparent/DistanceOpacityDiffuse" {
   Properties {
   
      _Color("MainColor",Color) = (1,1,1,1)
      _Distance("Distance", Range (0, 200)) = 100
     _MainTex ("Base (RGB)", 2D) = "white" {}
     
                 }

Category {


    Tags {"Queue" = "Transparent"}
    Alphatest Greater 0
   
   ColorMask RGB
   Fog { Color [_AddFog] }
   SubShader {
   
   Pass {
   Tags {"LightMode" = "Always"}
   Blend SrcAlpha OneMinusSrcAlpha   

//
   
////////////////////////////////////////AmbientPass/////////////////////////////////////////////
          CGPROGRAM
         
    #pragma vertex vert
    #pragma fragment frag
    #include "UnityCG.cginc"

struct appdata {
    float4 vertex : POSITION;
};

struct v2f {
   V2F_POS_FOG;
   float4 color : COLOR;
   float3 viewV : TEXCOORD0;
   float2   uv;   
};

uniform float4 _Color;
uniform float _Distance;
uniform float4 _MainTex_ST;

v2f vert (appdata_base v)
{   
   v2f o;
   PositionFog( v.vertex, o.pos, o.fog );
   o.viewV = ObjSpaceViewDir( v.vertex );
   o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);   
   return o;
}

uniform sampler2D _MainTex;

float4 frag (v2f i) : COLOR
{     
   half4 texcol = tex2D( _MainTex, i.uv );
   
//half4 final = tex2D( _MainTex, i.uv ); //_Color;//
   texcol.a = saturate(length(i.viewV)/_Distance);
   return texcol;   
}
ENDCG
         SetTexture [_MainTex] {combine texture}
    }
   
   }
}
FallBack "Diffuse", 1
}
pak
UNец
 
Сообщения: 8
Зарегистрирован: 17 сен 2009, 10:22


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

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

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