Адаптированный сурфейс шейдер Planet

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

Адаптированный сурфейс шейдер Planet

Сообщение Guyver 26 ноя 2010, 17:21

Разбирался тут в сурфейс шейдерах .. решил перевести шейдер планеты из ВИКИ в сурфейс шейдер..

первое с чем столкнулся - нет мультипасса .. так что придётся создавать 2 одинаковых шарика, на 1 кидать матерал планеты на 2й материал атмосферы...

Шейдер долго не хотел работать так как я этого хотел, поэтому там могут быть небольшие отступления от источника...

planet.png


сама планета
Синтаксис:
Используется glsl
Shader "Planet"
{
    Properties
    {
        _MainTex("Texture (RGB)", 2D) = "black" {}
        _Color("Color", Color) = (0.5, 0.5, 0.5, 1)
        _AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
        _FalloffPlanet("Falloff Planet", Float) = 5
        _TransparencyPlanet("Transparency Planet", Float) = 2
    }
   
    SubShader
    {
        Tags { "RenderType" = "Opaque" "IgnoreProjector"="True" }
        Cull Back
       
        CGPROGRAM
                #pragma surface surf Lambert vertex:vert
       
        uniform float4 _Color;
        uniform float4 _AtmoColor;
        uniform float _FalloffPlanet;
        uniform float _TransparencyPlanet;

        struct Input {
          float2 uv_MainTex;
                  float3 norm;
                  float3 vDir;
        };
               
        void vert (inout appdata_full v, out Input o) {
                  o.norm = v.normal.xyz;                 
                  o.vDir = ObjSpaceViewDir( v.vertex );
        }              

        sampler2D _MainTex;
        void surf (Input IN, inout SurfaceOutput o) {
                  float3 normal = normalize(IN.norm);
                  float3 view = normalize(IN.vDir);

                  float4 atmo = _AtmoColor;
          atmo.a = pow(1.0-saturate(dot(view, normal)), _FalloffPlanet) * _TransparencyPlanet;
                 
                  float3 diffuse = tex2D (_MainTex, IN.uv_MainTex).rgb * _Color;
                 
          o.Albedo = lerp(diffuse, atmo.rgb, atmo.a);
        }
        ENDCG
    }
   
    FallBack "Diffuse"
}
 


атмосфера
Синтаксис:
Используется glsl
Shader "Atmosphere"
{
    Properties
    {
        _AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
        _Size("Size", Float) = 0.1
        _Falloff("Falloff", Float) = 5
        _Transparency("Transparency", Float) = 15
    }
   
    SubShader
    {
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType" = "Transparent" }
        Cull Front
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        #pragma surface surf Atmosphere  alpha vertex:vert

        half4 LightingAtmosphere (SurfaceOutput s, half3 lightDir, half atten) {
                  half4 c = float4 ( s.Albedo, 0.0 );
          return c;
        }

        uniform float4 _AtmoColor;
        uniform float _Size;
        uniform float _Falloff;
        uniform float _Transparency;

        struct Input {
                  float3 norm;
                  float3 lDir;
                  float3 vDir;
        };
               
                inline float3 _invObjSpaceViewDir( in float4 v )
                {
                  float3 objSpaceCameraPos = mul(_World2Object, float4(_WorldSpaceCameraPos.xyz, 1)).xyz * unity_Scale.w;
                  return v.xyz - objSpaceCameraPos;
                }

        void vert (inout appdata_full v, out Input o) {
          v.vertex.xyz += v.normal * _Size;

                  o.norm = v.normal.xyz;
                  o.lDir = ObjSpaceLightDir( v.vertex );
                  o.vDir = _invObjSpaceViewDir( v.vertex );
        }

        void surf (Input IN, inout SurfaceOutput o) {
                  float3 normal = normalize (IN.norm);
                  float3 light = normalize(IN.lDir);
                  float3 view = normalize(IN.vDir);
                       
                  float temp = pow(saturate(dot(view, normal)), _Falloff) * _Transparency * dot (light, normal);
                                 
          o.Albedo = _AtmoColor.rgb;
                  o.Alpha =  temp;
        }
        ENDCG
    }
    FallBack "None"
}
 


впринципе мне нравится как он работает ... только смущает что картинка в редакторе отличается от картинки в запущенном приложении (сдаётся мне что в редакторе насильно добавляется лишний источник света один-другой)
У вас нет доступа для просмотра вложений в этом сообщении.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Адаптированный сурфейс шейдер Planet

Сообщение gnoblin 26 ноя 2010, 18:14

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

Re: Адаптированный сурфейс шейдер Planet

Сообщение gnoblin 26 ноя 2010, 18:17

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

Re: Адаптированный сурфейс шейдер Planet

Сообщение Guyver 26 ноя 2010, 18:50

Я вебом не особо занимаюсь .. и поэтому не знаю как деплоить веб демки.
Да и толку мало .. повторить сцену очень просто .. 2 сферы, 2 материала, 1 текстура (можно землю её в инете полно), 1 источник света поинт. (дефолтные значения крутилок дадут норм картинку)

про пасс не сурфейс ... как это выглядит по синтаксису ?

Синтаксис:
Используется glsl
Shader "Atmosphere"
{
    Properties  {
       //...
    }
   
    SubShader
    {
        Tags { "RenderType" = "Opaque" "IgnoreProjector"="True" }
        Cull Back
       
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
           //...
           //...
        ENDCG

        Pass {
           Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType" = "Transparent" }
           Cull Front
           Blend SrcAlpha OneMinusSrcAlpha
           
           CGPROGRAM
           #pragma <span style="font-weight: bold">уже нормальный пасс по канонам старых добрых HLSL</span>
              //...
              //...
           ENDCG
        }
    }
    FallBack "None"
}
 


я прав? или гдето погнал. И как он будет вызываться? при дифузной отрисовке в queue прозрычных обьектов?
я просто на офф форуме натыкался на фразу типа Surf шейдеры не держат проходы ... однако смутило что оставили Pass в документации.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Адаптированный сурфейс шейдер Planet

Сообщение gnoblin 26 ноя 2010, 19:33

ну так шейдеры же сурфейс шейдерами не ограничиваются.
сурфейсы нужны только если нужна реакция на освещение.

нельзя сделать два пасса сурфейса... я пробовал либо дублировать объекты, либо вешать два мата на объект.

несурфейс пасс можно впихивать либо до, либо после сурфейса.

Синтаксис:
Используется glsl
Shader "New Shader" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
                Pass{}
       
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert

                sampler2D _MainTex;

                struct Input {
                        float2 uv_MainTex;
                };

                void surf (Input IN, inout SurfaceOutput o) {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
               
                Pass{}
        }
        FallBack "Diffuse"
}
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Адаптированный сурфейс шейдер Planet

Сообщение sergelee 07 сен 2013, 14:41

Guyver Большое спасибо, давно искал что-то подобное!
учусь... всегда учусь...
Аватара пользователя
sergelee
UNец
 
Сообщения: 41
Зарегистрирован: 18 авг 2013, 09:44
Откуда: Украина, Харьков
  • Сайт

Re: Адаптированный сурфейс шейдер Planet

Сообщение getAlex 08 сен 2013, 21:27

sergelee писал(а):Guyver Большое спасибо, давно искал что-то подобное!

На вики уже давно есть шейдера с атмосферой и свечением городов на тёмной стороне, в зависимости от тени. Не знаю как вы искали -этой теме уже 3 года.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30


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

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

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