Как объединить два шейдера?

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

Как объединить два шейдера?

Сообщение marat 26 дек 2012, 01:01

Screen Shot 2012-12-25 at 11.53.40 PM.png
Screen Shot 2012-12-25 at 11.50.01 PM.png
Привет!

Хочу объединить два шейдера в один. Оба шейдера по отдельности работают, но после того как объединяю их,
работает только тот Subshader, который первый по списку. Что я не так делаю? Хочу Bunped Diffuse + Alpha Cutoff

http://docs.unity3d.com/Documentation/C ... aTest.html

Синтаксис:
Используется glsl
Shader "V4"
{
    Properties
    {
        _Color ("Diffuse tint", COLOR) = (1,1,1)
        _MainTex ("Diffuse texture", 2D) = "white" {}  
        _BumpMap ("Normalmap", 2D) = "bump" {}
           _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }

        SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
                Material {
                        Diffuse [_Color]
                        Ambient [_Color]
                }
                Lighting On
                Cull Off

                Pass {
                        AlphaTest Greater [_Cutoff]
                        SetTexture [_MainTex] {
                                combine texture * primary, texture
                        }
                }

                Pass {
                        ZWrite off
                        ZTest Less
                        AlphaTest LEqual [_Cutoff]

                        Blend SrcAlpha OneMinusSrcAlpha

                        SetTexture [_MainTex] {
                                combine texture * primary, texture
                        }
                }
        }

        SubShader {
                Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
                LOD 250
               
                CGPROGRAM
                #pragma surface surf Lambert alphatest:_Cutoff
               
                sampler2D _MainTex;
                sampler2D _BumpMap;
                fixed4 _Color;
               
                struct Input {
                        float2 uv_MainTex;
                        float2 uv_BumpMap;
                } ;
               
                void surf (Input IN, inout SurfaceOutput o) {
                        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                }
                ENDCG
        }
}
У вас нет доступа для просмотра вложений в этом сообщении.
marat
UNец
 
Сообщения: 31
Зарегистрирован: 25 дек 2012, 20:39

Re: Как объединить два шейдера?

Сообщение seaman 26 дек 2012, 07:34

Я, конечно, не спец в шейдерах, но явно нужно не сабшейдер использовать. Сабшейдер выбирается первый, который поддерживает карта. Можно попробовать еще пасс добавить. Но т.к. я нуб в шейдерах - у меня не получилось с пассами (в своем примере, не в этом).
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как объединить два шейдера?

Сообщение waruiyume 26 дек 2012, 07:43

А встроенный, чем не устраивает?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как объединить два шейдера?

Сообщение marat 26 дек 2012, 11:02

waruiyume писал(а):А встроенный, чем не устраивает?



Встроенные устроилбы, но проблемы с прозрачностью (края обгрызанные).
Вроде Transparent/Bumped Diffuse устраивает, но в модели появляются дырки и модель в итоге смотрится ужасно.


Объединение вроде получилось но результат с прозрачностью обгрызаный:

Синтаксис:
Используется glsl
Shader "V4"
{
    Properties
    {
        _Color ("Diffuse tint", COLOR) = (1,1,1)
        _MainTex ("Diffuse texture", 2D) = "white" {}  
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }

        SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 250
       
                CGPROGRAM
                #pragma surface surf Lambert alphatest:_Cutoff
               
                sampler2D _MainTex;
                sampler2D _BumpMap;
                fixed4 _Color;
               
                struct Input {
                        float2 uv_MainTex;
                        float2 uv_BumpMap;
                };
               
                void surf (Input IN, inout SurfaceOutput o) {
                        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                }
                ENDCG          

                Material {
                        Diffuse [_Color]
                        Ambient [_Color]
                }
                Lighting On

                Cull Off

                Pass {
                        AlphaTest Greater [_Cutoff]
                        SetTexture [_MainTex] {
                                combine texture * primary, texture
                        }
                }

                Pass {
                        ZWrite off
                        ZTest Less
                        AlphaTest LEqual [_Cutoff]

                        Blend SrcAlpha OneMinusSrcAlpha

                        SetTexture [_MainTex] {
                                combine texture * primary, texture
                        }
                }                      
        }
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось marat 26 дек 2012, 12:49, всего редактировалось 1 раз.
marat
UNец
 
Сообщения: 31
Зарегистрирован: 25 дек 2012, 20:39

Re: Как объединить два шейдера?

Сообщение waruiyume 26 дек 2012, 12:11

Как-нибудь так.
Синтаксис:
Используется glsl
Shader "Custom/NewShader"
{
Properties
{
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}

SubShader
{
//Shader "Transparent/Cutout/Bumped Diffuse"
                Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
                LOD 300
       
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;

        struct Input
        {
                float2 uv_MainTex;
                float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha = c.a;
                o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG


//Shader "Transparent/Bumped Diffuse"
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
       
                CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;

        struct Input
        {
                float2 uv_MainTex;
                float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha = c.a;
                o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
}

        FallBack "Transparent/Cutout/Diffuse"
}

 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как объединить два шейдера?

Сообщение marat 26 дек 2012, 12:48

waruiyume писал(а):Как-нибудь так.
Синтаксис:
Используется glsl
Shader "Custom/NewShader"
{
Properties
{
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}

SubShader
{
//Shader "Transparent/Cutout/Bumped Diffuse"
                Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
                LOD 300
       
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;

        struct Input
        {
                float2 uv_MainTex;
                float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha = c.a;
                o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG


//Shader "Transparent/Bumped Diffuse"
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
       
                CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;

        struct Input
        {
                float2 uv_MainTex;
                float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha = c.a;
                o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
}

        FallBack "Transparent/Cutout/Diffuse"
}

 



Отлично, работает!
Надо потестировать на мобилке!
marat
UNец
 
Сообщения: 31
Зарегистрирован: 25 дек 2012, 20:39

Re: Как объединить два шейдера?

Сообщение marat 26 дек 2012, 14:20

Всё-же проблемы есть. Если модель смотреть с боку то видим следующие:
У вас нет доступа для просмотра вложений в этом сообщении.
marat
UNец
 
Сообщения: 31
Зарегистрирован: 25 дек 2012, 20:39


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

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

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