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

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

СообщениеДобавлено: 10 фев 2010, 19:19
gnoblin
Создал тему на оф форуме 8-|
http://forum.unity3d.com/viewtopic.php?p=267347#267347

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

СообщениеДобавлено: 11 фев 2010, 15:32
gnoblin
Вот как работает _radial_fade с персонажами из CharacterCustomization примера.

По какой-то (непонятной мне) причине - серый фон я теперь не наблюдаю по краям модельки :-w .

То есть единственная критичная проблема с этим шейдером - это то что он иногда отрезает части модельки, а некоторые части контура остаются "рублеными".

Battle Angel Alita, если ты не против, я запосчу твой шейдер на оф форуме в теме, которую я недавно создал. Ок? :)

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

СообщениеДобавлено: 11 фев 2010, 15:42
gnoblin
На тестовом компе при использовании radial fade фпс снижается с 45 до 43 (всего-то)... Те части контура объекта на который шейдер срабатывает - выглядят замечательно (не видно рубленых краев... как раз то что надо)!

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

СообщениеДобавлено: 11 фев 2010, 17:06
gnoblin
Огого). Оказалось что персонажа рубила near clipping plane. Отодвигаем камеру - рубить перестает. Но все равно часть контура объекта рубленые :|

То что фон иногда виден в контуре - тоже вроде бы связано с тем как заданы clipping planes

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

СообщениеДобавлено: 11 фев 2010, 17:25
gnoblin
Вопрос: а почему radial fade как-то по-разному работает с перспективной камерой и ортографической проекцией? ~o)

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

СообщениеДобавлено: 11 фев 2010, 17:29
gnoblin
С включенным pixel light на объекте с _radial_fade появляется черная рамочка.

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

СообщениеДобавлено: 16 фев 2010, 22:08
Battle Angel Alita
Поидее этого можно избежать, заставив юнити рендерить модельку в самом конце, через Tags {"Queue" = "Transparent"}, но этот тег видимо неработает.

Оказывается этот тег работает если его вынести из пасса выше, в сабшейдер
Код: Выделить всё
SubShader
{
   Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
   Pass
      {
         Blend SrcAlpha OneMinusSrcAlpha

Теперь по краям не будет какой-то непонятной рамки.

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

СообщениеДобавлено: 17 фев 2010, 03:05
Neodrop
А можно пример с картинкой? ;;)

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

СообщениеДобавлено: 05 апр 2010, 15:41
andru
Доброе время суток!


Аналог который эмитирует AA на слабых машинах.
Сделан на базе фура - проблема в увеличении полигонов пропорционально проходам. Но можно использовать если небольшое количество триугольников!

sample.jpg



Шейдер

Код: Выделить всё
Shader "Fur"
{
   Properties
   {
      _FurLength ("Fur Length", float) = .25
      _MainTex ("Base (RGB)", 2D) = "white" { }
      _Cutoff ("Alpha Cutoff", float) = .0001
      _EdgeFade ("Edge Fade", float) = 0.4
      _LightDirection0 ("Light Direction 0, Ambient", Vector) = (1,0,0,1)
      _MyLightColor0 ("Light Color 0", Color) = (1,1,1,1)
      _LightDirection1 ("Light Direction 1, Ambient", Vector) = (1,0,0,1)
      _MyLightColor1 ("Light Color 1", Color) = (1,1,1,1)
      
      
   }
   Category
   {
      ZWrite On
      //ZTest Less
      Cull back
      
      Tags {"Queue" = "Transparent"}
      Blend SrcAlpha OneMinusSrcAlpha
      Alphatest Greater [_Cutoff]
      
      SubShader
      {
         Pass
         {
         
            //ZWrite On
            //Blend Off
            //Cull back
            
            CGPROGRAM
            // vertex VertexProgram
            #define FUR_MULTIPLIER 0.0
            #include "FurHelpers.cginc"
            ENDCG
            SetTexture [_MainTex]
            {
               constantColor(1,1,1,1)
               combine texture * primary double, constant
            }
         }
         Pass
         {
         
            //ZWrite On
            //Cull back

            
            CGPROGRAM
            // vertex VertexProgram
            #define FUR_MULTIPLIER 0.1
            #include "FurHelpers.cginc"
            ENDCG
            SetTexture [_MainTex]
            {
               combine texture * primary double, texture * primary
            }
         }
         Pass
         {
         
            //ZWrite On
            //Cull back

            
            CGPROGRAM
            // vertex VertexProgram
            #define FUR_MULTIPLIER 0.2
            #include "FurHelpers.cginc"
            ENDCG
            SetTexture [_MainTex]
            {
               combine texture * primary double, texture * primary
            }
         }   
         Pass
         {
         
            //ZWrite On
            //Cull back

            
            CGPROGRAM
            // vertex VertexProgram
            #define FUR_MULTIPLIER 0.3
            #include "FurHelpers.cginc"
            ENDCG
            SetTexture [_MainTex]
            {
               combine texture * primary double, texture * primary
            }
         }   
      }
      Fallback " VertexLit", 1
   }
}



.cginc

Код: Выделить всё
#ifndef FUR_HELPERS_INCLUDED
#define FUR_HELPERS_INCLUDED

#include "UnityCG.cginc"

struct v2f {
   V2F_POS_FOG;
   float4 color : COLOR0;
   float4 uv : TEXCOORD0;
};

uniform float _FurLength;
uniform float _EdgeFade;
uniform float4 _LightDirection0;
uniform float4 _MyLightColor0;
uniform float4 _LightDirection1;
uniform float4 _MyLightColor1;

sampler2D _MainTex : register(s0);

void FurVertexPass(float multiplier, appdata_base v, float furLength,
    out float4 pos, out float fog, out float4 color, out float4 uv)
{
    // extrude position
    float4 wpos = v.vertex;
    wpos.xyz += v.normal * furLength * multiplier;
    pos = mul(glstate.matrix.mvp, wpos);   

    // fog
    fog = pos.w;
   
    // UV (pass through to save instr - loses tiling/offset though)
   uv = mul( glstate.matrix.texture[0], v.texcoord );
   
    // edge fade out
    float alpha = 1 - (multiplier * multiplier);
    // transform normal into eye space and use Z component
    // to control the fade
    float3 eyeNormal = mul((float3x3)glstate.matrix.modelview[0],
        v.normal);
    alpha += saturate(eyeNormal.z) - _EdgeFade;
   
    // lighting
    float3 normalWorld = mul ((float3x3)_Object2World, v.normal);
   
    float light0 = clamp(dot(normalWorld, _LightDirection0.xyz),
        _MyLightColor0.w, 1);
    float light1 = clamp(dot(normalWorld, _LightDirection1.xyz),
        _MyLightColor1.w, 1);

    color = float4((light0 * _MyLightColor0).xyz +
        (light1 * _MyLightColor1).xyz,alpha);
}


v2f VertexProgram (appdata_base v)
{
   v2f o;
   FurVertexPass( FUR_MULTIPLIER, v, _FurLength, o.pos, o.fog, o.color, o.uv );
   return o;
}

#endif



Хотелось бы еще прикрутить к этому примеру прозрачность и заточить на максимальное быстродействие (избавиться от ненужных компонентов)

Есть ли мысли по этому поводу у кого-нибудь?

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

СообщениеДобавлено: 05 апр 2010, 18:08
gnoblin
30-40 фпс с 10ю персами из чаркуста с одним материалом на перса.

Тестовая машина: Celeron 1.4 ghz, 512RAM, Radeon X200 Mobile.

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

СообщениеДобавлено: 05 апр 2010, 19:02
Battle Angel Alita
andru
Код: Выделить всё
Pass
{...}
Pass
{...}
Pass
{...}
Pass
{...}

жииррр

Кстати, незнаю как на мобилити радеонах, но на интелах вертексные шейдеры работают в софтварном режиме.

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

СообщениеДобавлено: 05 апр 2010, 20:02
gnoblin
какие будут предложения? :D

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

СообщениеДобавлено: 05 апр 2010, 20:54
gerasim
Непонятно зачем вапще края размывать. Ну будет контур угловатый для лоуполи. Тогдауж сделать модель на 2Ктрис вместо 500 - будет более сглажено. Если нормадмапой типа шерсти покрыть лоуполи - там и не видать краёв)
Вот модель на 460трисов, ноги крючит потомушто он прыгает как кошка, с несвоей анимацыей.

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

СообщениеДобавлено: 05 апр 2010, 22:57
andru
[quote="Battle Angel Alita"]andru
Код: Выделить всё
Pass
{...}
Pass
{...}
Pass
{...}
Pass
{...}

жииррр

Согласен жир но можно "pass pass" или "pass pass pass" - эффект все равно читаться и смотрится не так пиксельно.

Какие будут предложения?

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

СообщениеДобавлено: 05 апр 2010, 23:33
andru
gerasim писал(а):Непонятно зачем вапще края размывать. Ну будет контур угловатый для лоуполи. Тогдауж сделать модель на 2Ктрис вместо 500 - будет более сглажено. Если нормадмапой типа шерсти покрыть лоуполи - там и не видать краёв)
Вот модель на 460трисов, ноги крючит потомушто он прыгает как кошка, с несвоей анимацыей.


Мне кажется если использовать нормал мэп, паралах и т.д, есть ли смысл делать модельку в 500 триугольников?) не слишком ли мало на такую красоту? Еще большое значение имеет масштаб - попробуй уменьшить свою овечку до размеров 64 - 128 пикселей в экране - будет смотреться совсем по другому.