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

Шейдеры и все-все-все.

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

Сообщение gnoblin 10 фев 2010, 19:19

Создал тему на оф форуме 8-|
http://forum.unity3d.com/viewtopic.php?p=267347#267347
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

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

Сообщение gnoblin 11 фев 2010, 15:32

Вот как работает _radial_fade с персонажами из CharacterCustomization примера.

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

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

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

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

Сообщение gnoblin 11 фев 2010, 15:42

На тестовом компе при использовании radial fade фпс снижается с 45 до 43 (всего-то)... Те части контура объекта на который шейдер срабатывает - выглядят замечательно (не видно рубленых краев... как раз то что надо)!
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

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

Сообщение gnoblin 11 фев 2010, 17:06

Огого). Оказалось что персонажа рубила near clipping plane. Отодвигаем камеру - рубить перестает. Но все равно часть контура объекта рубленые :|

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

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

Сообщение gnoblin 11 фев 2010, 17:25

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

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

Сообщение gnoblin 11 фев 2010, 17:29

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

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

Сообщение Battle Angel Alita 16 фев 2010, 22:08

Поидее этого можно избежать, заставив юнити рендерить модельку в самом конце, через Tags {"Queue" = "Transparent"}, но этот тег видимо неработает.

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

Теперь по краям не будет какой-то непонятной рамки.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение Neodrop 17 фев 2010, 03:05

А можно пример с картинкой? ;;)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

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

Сообщение andru 05 апр 2010, 15:41

Доброе время суток!


Аналог который эмитирует 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



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

Есть ли мысли по этому поводу у кого-нибудь?
У вас нет доступа для просмотра вложений в этом сообщении.
_ttp://www.bigfishgames.com/download-ga ... index.html
_ttp://www.gamehouse.com/download-games/dreamwoods
Аватара пользователя
andru
UNец
 
Сообщения: 30
Зарегистрирован: 21 янв 2010, 23:30

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

Сообщение gnoblin 05 апр 2010, 18:08

30-40 фпс с 10ю персами из чаркуста с одним материалом на перса.

Тестовая машина: Celeron 1.4 ghz, 512RAM, Radeon X200 Mobile.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

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

Сообщение Battle Angel Alita 05 апр 2010, 19:02

andru
Код: Выделить всё
Pass
{...}
Pass
{...}
Pass
{...}
Pass
{...}

жииррр

Кстати, незнаю как на мобилити радеонах, но на интелах вертексные шейдеры работают в софтварном режиме.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение gnoblin 05 апр 2010, 20:02

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

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

Сообщение gerasim 05 апр 2010, 20:54

Непонятно зачем вапще края размывать. Ну будет контур угловатый для лоуполи. Тогдауж сделать модель на 2Ктрис вместо 500 - будет более сглажено. Если нормадмапой типа шерсти покрыть лоуполи - там и не видать краёв)
Вот модель на 460трисов, ноги крючит потомушто он прыгает как кошка, с несвоей анимацыей.
У вас нет доступа для просмотра вложений в этом сообщении.
Неследите - и неследимы будете.
Аватара пользователя
gerasim
UNITрон
 
Сообщения: 166
Зарегистрирован: 17 апр 2009, 15:56
Откуда: Самара

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

Сообщение andru 05 апр 2010, 22:57

[quote="Battle Angel Alita"]andru
Код: Выделить всё
Pass
{...}
Pass
{...}
Pass
{...}
Pass
{...}

жииррр

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

Какие будут предложения?
Последний раз редактировалось andru 05 апр 2010, 23:40, всего редактировалось 1 раз.
_ttp://www.bigfishgames.com/download-ga ... index.html
_ttp://www.gamehouse.com/download-games/dreamwoods
Аватара пользователя
andru
UNец
 
Сообщения: 30
Зарегистрирован: 21 янв 2010, 23:30

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

Сообщение andru 05 апр 2010, 23:33

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


Мне кажется если использовать нормал мэп, паралах и т.д, есть ли смысл делать модельку в 500 триугольников?) не слишком ли мало на такую красоту? Еще большое значение имеет масштаб - попробуй уменьшить свою овечку до размеров 64 - 128 пикселей в экране - будет смотреться совсем по другому.
_ttp://www.bigfishgames.com/download-ga ... index.html
_ttp://www.gamehouse.com/download-games/dreamwoods
Аватара пользователя
andru
UNец
 
Сообщения: 30
Зарегистрирован: 21 янв 2010, 23:30

Пред.След.

Вернуться в Shader Lab

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

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