Страница 1 из 4

шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 10 янв 2010, 21:35
gnoblin
Реально написать шейдер который бы по контуру модели край плавно заводил в 0-альфу?
Что-то вроде мультяшной обводки, только "внутрь" и с прозрачностью.

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 10 янв 2010, 21:37
Neodrop
Чисто теоритически - конечно реально. НО я валенок в шейдерах, ты знаешь ;0)

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 11 янв 2010, 14:03
Battle Angel Alita
Это sort of Rim Light, только надо не подсвечивать контур, а уменьшать его альфу.

Код: Выделить всё
Shader "_radial_fade"
{

   Properties
   {
      _MainTex ("Base (RGB)", 2D) = "white" {}
      _Range ("Range", Range (1.0, 8.0)) = 4.0
   }
   
   SubShader
   {
        Pass
      {
         Blend SrcAlpha OneMinusSrcAlpha
         Tags {"Queue" = "Transparent"}

CGPROGRAM
   #pragma vertex vert
   #pragma fragment frag

   #include "UnityCG.cginc"
   
   struct v2f
   {
      V2F_POS_FOG;
      float2 uv;
      float3 normal;
      float3 viewDir;
   };

   uniform float4 _MainTex_ST;
   v2f vert(appdata_tan v)
   {
      v2f o;
      PositionFog(v.vertex, o.pos, o.fog);
      o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
      
      o.normal = v.normal;
      o.viewDir = ObjSpaceViewDir(v.vertex);
      
      return o;
   }
   
   uniform sampler2D _MainTex;
   uniform float _Range;
   float4 frag(v2f i) : COLOR
   {
      float4 albedo = tex2D(_MainTex, i.uv);
      
      float3 normal = normalize(i.normal);
      float3 viewDir = normalize(i.viewDir);
      float fade = dot(normal, viewDir);
      
      fade = fade * _Range;
      fade = min(fade, 1.0);
            
      float4 c;
      c.rgb = albedo;
      c.a = fade;
      return c;
   }
ENDCG

      }
   }
}

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 11 янв 2010, 21:51
Neodrop
Battle Angel Alita, я всё больше радуюсь такому камраду в Сообществе. :ymapplause:

(3A4OT)

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 11 янв 2010, 23:05
Paul Siberdt
А без шейдеров делов - пробить по вертексам границы нулевую альфу :p ... если вертексов некрасиво мало - создать полигональную кайму - всяко сэкономим на расчетах и текстурной памяти.

А Алита - не тот ли самый ангел, о котором Кэмерон собирается драму снимать? :ymsmug:

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 01:19
gnoblin
А без шейдеров делов - пробить по вертексам границы нулевую альфу :p ... если вертексов некрасиво мало - создать полигональную кайму - всяко сэкономим на расчетах и текстурной памяти.


Не понял в чем крутость этого способа...

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 02:30
Paul Siberdt
Мы получаем alpha-маску и вся крутость в том, что прозрачность отдается на откуп вертексному цвету и у нас развязаны руки для манипуляции с UV-setом.
Не нужно создавать текстуру с альфой, не нужно создавать отдельную маску, не нужно создавать дополнительный Ювисет, не нужно, наконец, писать шейдер, всем перечисленным напрягая филлрейт.

Для меня, как труженика на платформе апляфонов, это серьезная оптимизация.

Где подобное удобно применять вообще? В элементах со скроллингом текстуры, например, плывущие за горизонт облака, набегающие на берег волны + в гигантском числе разнообразных аддитивных (и не только) спецэффектов, в которых пользовать шейдер - неоправданная роскошь.

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 02:48
Neodrop
Хорошо бы примером подкрепить эти замечательные выкладки. :-?

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 10:34
Paul Siberdt
эээ.. а как вы добавляете в пост окошко веб-плеера? ... а, понятно, сцылка на внешний ресурс... нету такова.
Во вложении пример с прогрессбаром.

У верхнего барчика вертекс-альфа очищена и потому видна неприятная граница по правому и левому краям.
У нижнего последние вертексы краев по альфе нулевые, что убирает каку.
Создавать же для подобного HUD-эффекта шейдер с альфа-маской я считаю забиванием гвоздей микроскопом :)

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 12:12
Paul Siberdt
Блин... сорри... чета я сильно тупанул насчет края модели. Ведь изначально подразумевался не край геометрии, а контур модели во вьюпорте?... то бишь, вопрос стоял о модификации картун-шейдера. Тут вертексная альфа не поможет :(

Но, в любом случае, пользу повертексной альфы это не уменьшает :D

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 17:17
gnoblin
Battle Angel Alita, здоровенное спасибо :ymsmug: .

А поможете прикрутить этот эффект с альфой по краям к другому моему шейдеру ( "XRay end VertexLit") :- ?

Мне б хотелось иметь все параметры из этого шейдера + альфаОбводку... И если можно - чтобы шейдер по-прежнему работал с DX 7 ("_radial_fade" требует sm 2.0, a "XRay end VertexLit" работает на седьмом).

Я использую вот такой шейдер:

Код: Выделить всё
Shader "XRay end VertexLit" {

    Properties {
        _ColorX ("Tint (RGB)", Color) = (1,1,1,1)
       
        _Min("Min",Range(-1,1))  = 0.5
        _Exp("Exp",Range(0,5))  = 0.5
        _Power("Power", Range (0,5)) = 0.5
   
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}

    }
    SubShader {
   
            Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeperateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
             }
            }
       
        Pass {
       
            Blend One One
           
            CGPROGRAM
            #pragma vertex vert
            #include "UnityCG.cginc"

            uniform float4 _ColorX;
           uniform float _Min;
            uniform float _Exp;
            uniform float _Power;

            struct appdata {
              float4 vertex : POSITION;
              float4 normal : NORMAL;
              float4 color : COLOR;
               };

            struct v2f {
               float4 pos   : POSITION;
               float4 color : COLOR;
            };
           
            v2f vert (appdata v) {
                v2f o;
                o.pos = mul( glstate.matrix.mvp, v.vertex);
                float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
               
                float KrMin = (_Power* _Min);
                float InvExp = (1.0/_Exp);
                float XBorder = lerp(_Power,KrMin,pow(abs(dot(v.normal,viewDir)),InvExp));
   
                //float XBorder = dot(viewDir,v.normal);
                float4 Xcol = float4((XBorder)*_ColorX);
                o.color = Xcol;
    return o;
            }
           
            ENDCG
        }
       
    }
    Fallback Off
}

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 17:31
gnoblin
Paul Siberdt, исходником шейдера поделишься? :)

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 17:39
Neodrop
Гноб, потом покажи тута, что вышло.

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 12 янв 2010, 19:21
Paul Siberdt
Ээээ... да у меня нет никакого шейдера. Есть текстурка с прогрессбаром, текстурка с градиентом, есть плашка с вертексной альфой по краям и есть скриптик хэлсбара. Сорри.. тестовую сцену на работе собрал, дома просто выдираю из контекста

Re: шейдер который сводил бы край модели в альфу

СообщениеДобавлено: 13 янв 2010, 00:54
gnoblin
Спасибо! Полезно, но не совсем то.