Сравнить угол между normal и viewdirection в vertex шейдере

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

Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение VBProgr 21 сен 2012, 19:10

Подскажите по данным вопросам насчет vertex шейдера, пожалуйста:

1. Как получить viewDirection? В surface шейдере он предоставляется в input,а в vertex - нет.

2. v.normal ведь float4, так? А viewDirection - float3 должно быть. Как сравнить угол между normal и viewdirection?

Мне нужно установить color.a в зависимости от угла между normal и направлением взгляда.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение MysTer92 21 сен 2012, 19:59

Вот так можно сравнить угол между нормалью и направлением взгляда в вертексном шейдере
Синтаксис:
Используется glsl
float3 worldNormal = mul((float3x3)_Object2World, v.normal);                   
float3 viewDir = normalize(WorldSpaceViewDir(v.vertex));                 
               
float rim = 1.0f - saturate(dot(worldNormal, viewDir));
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение VBProgr 22 сен 2012, 00:49

Сделал как вы написали. Атмосфера вокруг планеты появилась и видна правильно в зависимости от угла камеры, но почему-то альфа у неё резко всегда переходит между 0 и 1. А должно быть градиентом.

Изображение
Синтаксис:
Используется glsl
Shader "SlinDev/Planet2"
{
    Properties
    {
        _MainTex("Texture (RGB)", 2D) = "black" {}
        _Color("Color", Color) = (0, 0, 0, 1)
        _AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
        _Size("Size", Float) = 0.1
        _Falloff("Falloff", Float) = 5
        _FalloffPlanet("Falloff Planet", Float) = 5
        _Transparency("Transparency", Float) = 15
        _TransparencyPlanet("Transparency Planet", Float) = 1
    }
        SubShader
    {          Pass
        {
            Name "AtmosphereBase"
            Tags {"LightMode" = "Always"}
            Cull Front
            Blend SrcAlpha One
           
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
               
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
               
                #include "UnityCG.cginc"
               
                uniform float4 _Color;
                uniform float4 _AtmoColor;
                uniform float _Size;
                uniform float _Falloff;
                uniform float _Transparency;
               
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float3 worldNormal : TEXCOORD0;
                    float3 worldvertpos : TEXCOORD1;
                    float3 viewDir : TEXCOORD2;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                   
                    v.vertex.xyz += v.normal*_Size;
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

                    //o.worldvertpos = mul(_Object2World, v.vertex);
                    o.worldvertpos = mul(_Object2World, v.vertex).xyz;

                    o.worldNormal = normalize(mul((float3x3)_Object2World, v.normal));
                    o.viewDir = normalize(WorldSpaceViewDir(v.vertex));                
                   
                    return o;
                }
               
                float4 frag(v2f i) : COLOR
                {
                    float4 color = _AtmoColor;
                    color.a = pow(1.0-saturate(dot(i.worldNormal, i.viewDir)), _Falloff);
                    //color.a *= _Transparency*_Color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.worldNormal);
                    return color;
                }
            ENDCG
        }
    }
   
    FallBack "Diffuse"
}
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение waruiyume 22 сен 2012, 02:00

Синтаксис:
Используется glsl
color.a = pow(dot(i.worldNormal, i.viewDir), _Falloff);
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение MysTer92 22 сен 2012, 10:43

В вертексном шейдере изменить на это, и станет ореол как надо
Синтаксис:
Используется glsl
o.viewDir = normalize(-WorldSpaceViewDir(v.vertex));
 

А в пиксельном оставить как было
Синтаксис:
Используется glsl
color.a = pow(1.0-saturate(dot(i.worldNormal, i.viewDir)), _Falloff);

Ток я не понял почему всё равно рассчитываете в пиксельном шейдере, но эт как хотите)

Вообще видимо нужно, чтобы чем меньше отклонение вектора нормали от вектора взгляда, тем значение ближе к 1, то сделать как предложил waruiyume
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение VBProgr 22 сен 2012, 15:54

Ток я не понял почему всё равно рассчитываете в пиксельном шейдере, но эт как хотите)
Потому что так было на вики. В шейдерах я новичок, поэтому не знаю, где лучше это рассчитывать. Если я правильно догадываюсь, вы предлагаете переделать в сурфейс?

Вообще видимо нужно, чтобы чем меньше отклонение вектора нормали от вектора взгляда, тем значение ближе к 1, то сделать как предложил waruiyume
Да, его решение подошло.

Но вот еще одна проблемка:
Изображение
Когда камера смотрит левее планеты, атмосфера уходит вправо. Но ведь она наоборот должна становится более видимой?

Т.е. когда планета находится напротив камеры, worldNormal будет направлен перпендекулярно камере - dot(i.worldNormal, i.viewDir) должен быть равен 0.5. Когда же камера съезжает вбок, например, влево, угол между viewDir и вертексами левого края будет уменьшаться - dot приближаться к 1.0. У меня же все наоборот!

При этом если инвертировать viewDir: o.viewDir = normalize(-WorldSpaceViewDir(v.vertex)) - абсолютно ничего не происходит. ~x(

И наоборот:
Красными стрелочками я показал, как должно быть.
Изображение

Откуда такой эффект?
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Сравнить угол между normal и viewdirection в vertex шейдере

Сообщение MysTer92 22 сен 2012, 20:39

Если я правильно догадываюсь, вы предлагаете переделать в сурфейс?

Не, просто dot(скалярное произведение) можно рассчитывать в вертексном шейдере, быстрее будет, если конечно эт мобильники)

А штука с искажением при сдвиге, то это не из-за шейдеров, а искажение из-за перспективы к краям. Можно уменьшить FOV раза в 3 у камеры - искажения к краям не будут такие сильные.
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ


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

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

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