Мягкие края

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

Мягкие края

Сообщение bog.imp 30 сен 2012, 22:41

обрий день,

У меня возник вопрос на счет мягких краев, сглаживание по алфа но мягкое,

Изображение

Линк на Google Drive

Справа: шейдер по принципу http://wiki.unity3d.com/index.php/Trans ... ture_Blend
в два проходи ми получаем мягкие края но так как он Vertex and Fragment Shaders у нас нету света, и не принимает тени.

Слева: у нас есть Surface Shaders но края шерховатие.

Так вот неужели нелзя совместить ети две техники, если есть идеи или решение прошу помоч,
или скажите куда копать.

К сожилению исползовать пост фильтри не подходят так как картинка получается мильной.

(Прошу прощение русский язик не родной по етому с ошибками)




:-bd UPD: Огромное Спасибо WhiteDevil помог решить проблему

Решение "LightMode" = "PrepassFinal"

Синтаксис:
Используется javascript
Shader "My Shaders/Surface" {
    Properties {
        _Color ("Main Color", Color) = (1, 1, 1, 1)
        _MainTex ("Texture", 2D) = "white" {}
        _Cutoff ("Cutoff", Range(0,1)) = 0.5
    }

            SubShader {
                    Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
                   
                        CGPROGRAM
                        #pragma surface surf Lambert
                        struct Input {
                            float2 uv_MainTex;
                        };
                         
                        float4 _Color;
                        sampler2D _MainTex;
                        fixed _Cutoff;
                       
                        void surf (Input IN, inout SurfaceOutput o) {
                               
                                half4 col = tex2D (_MainTex, IN.uv_MainTex);
                            o.Albedo = _Color * col.rgb;
                            clip(col.a - _Cutoff);
                        }
                        ENDCG
                       
                   Pass {
                                Tags { "RequireOption" = "SoftVegetation" "LightMode" = "PrepassFinal"}  
                                Blend SrcAlpha OneMinusSrcAlpha
                                ZWrite off
                                CGPROGRAM
                            #pragma vertex vert
                        #pragma fragment frag
                       
                        #include "UnityCG.cginc"
       
                        struct appdata_t {
                                float4 vertex : POSITION;
                                float2 texcoord : TEXCOORD0;
                        };
       
                        struct v2f {
                                float4 vertex : POSITION;
                                float2 texcoord : TEXCOORD0;
                        };
       
                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        fixed _Cutoff;
                       
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                                return o;
                        }
                       
                        float4 _Color;
                        half4 frag (v2f i) : COLOR
                        {
                                half4 col = _Color * tex2D(_MainTex, i.texcoord);
                                clip(-(col.a - _Cutoff));
                                return col;
                        }
                                ENDCG
                        }
                                         
            }  
   
    Fallback "Diffuse"
  }
 



UPD2: С етим методом есть неприятная особеность ето то что при пересечение двух одинакових обектов с тем же шейдером у нас не будут мягкие края
Последний раз редактировалось bog.imp 04 окт 2012, 20:20, всего редактировалось 4 раз(а).
Аватара пользователя
bog.imp
UNец
 
Сообщения: 3
Зарегистрирован: 22 апр 2011, 23:26
  • Сайт

Re: Мягкие края

Сообщение mrcoder 01 окт 2012, 11:17

ваша картинка не отображается
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Мягкие края

Сообщение WhiteDevil 01 окт 2012, 13:21

Приведите пожалуйста код сёрфэйс шейдера
Кстати Vertex + Fragment шейдера со светом работать умеют. Просто вы за базу взяли Unlit шейдер
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Мягкие края

Сообщение bog.imp 01 окт 2012, 16:49

WhiteDevil писал(а):Приведите пожалуйста код сёрфэйс шейдера
Кстати Vertex + Fragment шейдера со светом работать умеют. Просто вы за базу взяли Unlit шейдер



Да пожалуйста
(версия для тестов потому есть лишнии вещи)

Shader тото что слева:

Синтаксис:
Используется javascript
Shader "My Shaders/Cutout/Bumped Specular Map"
{
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
        _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _SpecMap ("Specmap", 2D) = "white" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5

        _CutoffInverseQuarter ("Cutoff inverse / 4  (Use Script)", Float) = 1

}

SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 400
       
CGPROGRAM
// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
#pragma exclude_renderers gles
#pragma surface surf BlinnPhong2 alphatest:_Cutoff
#pragma exclude_renderers flash


sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _SpecMap;
fixed4 _Color;
half _Shininess;

struct SurfaceOutput2 {
        fixed3 Albedo;
        fixed3 Normal;
        fixed3 Emission;
        half Specular;
        half3 GlossColor;
        fixed Gloss;
        fixed Alpha;
};


// NOTE: some intricacy in shader compiler on some GLES2.0 platforms (iOS) needs 'viewDir' & 'h'
// to be mediump instead of lowp, otherwise specular highlight becomes too bright.
inline fixed4 LightingBlinnPhong2 (SurfaceOutput2 s, fixed3 lightDir, half3 viewDir, fixed atten)
{
        half3 h = normalize (lightDir + viewDir);
       
        fixed diff = max (0, dot (s.Normal, lightDir));
       
        float nh = max (0, dot (s.Normal, h));
        float spec = pow (nh, s.Specular*256.0) * s.GlossColor;
       
        fixed4 c;
        c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * s.Gloss * spec) * (atten * 2);
        c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
        return c;
}

inline fixed4 LightingBlinnPhong2_PrePass (SurfaceOutput2 s, half4 light)
{
        fixed spec = light.a * s.Gloss;
        fixed4 c;
        c.rgb = (s.Albedo * light.rgb + light.rgb * s.GlossColor * _SpecColor.rgb * spec);
        c.a = s.Alpha + spec * _SpecColor.a;
        return c;
}


struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
};

void surf (Input IN, inout SurfaceOutput2 o) {
        fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
        fixed4 spec = tex2D(_SpecMap, IN.uv_MainTex);
        o.Albedo = tex.rgb * _Color.rgb;
        o.Gloss = tex.a;
        o.GlossColor = spec.rgb;
        o.Alpha = tex.a * _Color.a;
        o.Specular = _Shininess;
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}

FallBack "Transparent/Cutout/VertexLit"
}


 



Shader тото что справа:

Синтаксис:
Используется javascript
Shader "My Shaders/Soft Edge Unlit Shadow" {
Properties {
        _Color ("Main Color", Color) = (1, 1, 1, 1)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}
SubShader {
        Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
        //Lighting On
       
        // Render both front and back facing polygons.
        Cull Back
       
        // first pass:
        //   render any pixels that are more than [_Cutoff] opaque
        Pass {  
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag

                        //#pragma debug        
                       
                        #include "UnityCG.cginc"

                        struct appdata_t {
                                float4 vertex : POSITION;
                                float4 color : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        struct v2f {
                                float4 vertex : POSITION;
                                float4 color : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        float _Cutoff;
                       
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.color = v.color;
                                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                                return o;
                        }
                       
                        float4 _Color;
                        half4 frag (v2f i) : COLOR
                        {
                                half4 col = _Color * tex2D(_MainTex, i.texcoord);
                                clip(col.a - _Cutoff);
                                return col;
                        }
                ENDCG
        }
        // Second pass:
        //   render the semitransparent details.
        Pass {
                Tags { "RequireOption" = "SoftVegetation" }
               
                // Dont write to the depth buffer
                ZWrite off
               
                // Set up alpha blending
                Blend SrcAlpha OneMinusSrcAlpha
               
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                       
                        #include "UnityCG.cginc"

                        struct appdata_t {
                                float4 vertex : POSITION;
                                float4 color : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        struct v2f {
                                float4 vertex : POSITION;
                                float4 color : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        float _Cutoff;
                       
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.color = v.color;
                                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                                return o;
                        }
                       
                        float4 _Color;
                        half4 frag (v2f i) : COLOR
                        {
                                half4 col = _Color * tex2D(_MainTex, i.texcoord);
                                clip(-(col.a - _Cutoff));
                                return col;
                        }
                ENDCG
        }
}
Fallback "Transparent/Cutout/VertexLit"
}
 



А можно поподробней, а можно с Вами поговорить чат или скайп, или линк на пример, если можно, буду благодарен.

если что вот линк на кртинку Google Drive

Спасибо.
Аватара пользователя
bog.imp
UNец
 
Сообщения: 3
Зарегистрирован: 22 апр 2011, 23:26
  • Сайт

Re: Мягкие края

Сообщение WhiteDevil 02 окт 2012, 12:51

Вот вроде как-то так. У меня не было подходящей текстуры с плавной альфой, но вроде все вот так и должно быть
Тут заюзан сёрф для геометрии и верт+фраг для бленда
Cutoff - альфа-граница между опак-геометрией и бленд-геометрией

Синтаксис:
Используется csharp
Shader "My Shaders/Surface" {
    Properties {
        _Color ("Main Color", Color) = (1, 1, 1, 1)
        _MainTex ("Texture", 2D) = "white" {}
        _Cutoff ("Cutoff", Range(0,1)) = 0.5
    }

            SubShader {
                        Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
                        CGPROGRAM
                        #pragma surface surf Lambert
                        struct Input {
                            float2 uv_MainTex;
                        };
                         
                        float4 _Color;
                        sampler2D _MainTex;
                        float _Cutoff;
                       
                        void surf (Input IN, inout SurfaceOutput o) {
                               
                                half4 col = tex2D (_MainTex, IN.uv_MainTex);
                            o.Albedo = _Color * col.rgb;
                            clip(col.a - _Cutoff);
                        }
                        ENDCG
                 
                    Pass {
                                Tags { "RequireOption" = "SoftVegetation" }
                                Blend SrcAlpha OneMinusSrcAlpha
                                ZWrite off
                                CGPROGRAM
                            #pragma vertex vert
                        #pragma fragment frag
                       
                        #include "UnityCG.cginc"
       
                        struct appdata_t {
                                float4 vertex : POSITION;
                                float2 texcoord : TEXCOORD0;
                        };
       
                        struct v2f {
                                float4 vertex : POSITION;
                                float2 texcoord : TEXCOORD0;
                        };
       
                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        float _Cutoff;
                       
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                                return o;
                        }
                       
                        float4 _Color;
                        half4 frag (v2f i) : COLOR
                        {
                                half4 col = _Color * tex2D(_MainTex, i.texcoord);
                                clip(-(col.a - _Cutoff));
                                return col;
                        }
                                ENDCG
                        }
            }  
   
    Fallback "Diffuse"
  }
 
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Мягкие края

Сообщение WhiteDevil 03 окт 2012, 12:28

Чтобы работало для Deffered path, нужно в тэги верт+фраг шейдера добавить "LightMode" = "PrepassFinal"
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55


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

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

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