Помогите дописать шейдер.

Полезная литература, исходники шейдеров из серьезных игр и других движков, ссылки на тематические ресурсы - всё здесь.

Помогите дописать шейдер.

Сообщение gerasim13 06 июн 2012, 20:14

Всем привет. Я пытаюсь портировать gauissian blur в unity. Столкнулся с одной проблемой, банально не могу передать переменную из одного pass в другой.
Вот оригинальный шейдер http://www.gamerendering.com/2008/10/11 ... er-shader/

А вот что вышло у меня, работает только последний "пасс"
Синтаксис:
Используется csharp
Shader "ex2D/Gaussian Blur" {
        Properties {
                _MainTex ("Atlas Texture", 2D) = "white" {}
                _BlurSize ("Blur Size", Range(0.9900, 0.9999)) = 0.2
        }
        SubShader {
                Tags {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
        }
        Cull Off
        Lighting Off
        ZWrite Off
        Fog { Color (0,0,0,0) }
        Blend SrcAlpha OneMinusSrcAlpha
       
        BindChannels {
            Bind "Color", color
            Bind "Vertex", vertex
            Bind "TexCoord", texcoord
        }
       
        Pass {
               
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
               
                #include "UnityCG.cginc"
               
                sampler2D _MainTex;
                float _BlurSize;
               
                struct v2f {
                        float4  pos : SV_POSITION;
                        float2  uv : TEXCOORD0;
                };
               
                float4 _MainTex_ST;
                sampler2D hBlurSample;
               
                v2f vert (appdata_base v) {
                        v2f o;
                        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                        o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
                        return o;
                }
               
                half4 frag (v2f i) : COLOR {
                        // blur in x (horizontal)
                        float4 sum = float4(0.0);
                        // take nine samples, with the distance blurSize between them
                        sum += tex2D (_MainTex, float2(i.uv.x - 4.0*_BlurSize, i.uv.y)) * 0.05;
                        sum += tex2D (_MainTex, float2(i.uv.x - 3.0*_BlurSize, i.uv.y)) * 0.09;
                        sum += tex2D (_MainTex, float2(i.uv.x - 2.0*_BlurSize, i.uv.y)) * 0.12;
                        sum += tex2D (_MainTex, float2(i.uv.x - _BlurSize, i.uv.y)) * 0.15;
                        sum += tex2D (_MainTex, i.uv) * 0.16;
                        sum += tex2D (_MainTex, float2(i.uv.x + _BlurSize, i.uv.y)) * 0.15;
                        sum += tex2D (_MainTex, float2(i.uv.x + 2.0*_BlurSize, i.uv.y)) * 0.12;
                        sum += tex2D (_MainTex, float2(i.uv.x + 3.0*_BlurSize, i.uv.y)) * 0.09;
                        sum += tex2D (_MainTex, float2(i.uv.x + 4.0*_BlurSize, i.uv.y)) * 0.05;
                       
                        half4 texcol = sum;
                        return texcol;
                }
               
                ENDCG
        }
       
        Pass {
                Name "Vertical Blur"
               
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
               
                #include "UnityCG.cginc"
               
                sampler2D _MainTex;
                float _BlurSize;
               
                struct v2f {
                        float4  pos : SV_POSITION;
                        float2  uv : TEXCOORD0;
                };
               
                float4 _MainTex_ST;
               
                v2f vert (appdata_base v) {
                        v2f o;
                        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                        o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
                        return o;
                }
               
                half4 frag (v2f i) : COLOR {
                        // blur in y (vertical)
                        float4 sum = float4(0.0);
                        // take nine samples, with the distance blurSize between them
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 4.0*_BlurSize)) * 0.05;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 3.0*_BlurSize)) * 0.09;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 2.0*_BlurSize)) * 0.12;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - _BlurSize)) * 0.15;
                        sum += tex2D (_MainTex, i.uv) * 0.16;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + _BlurSize)) * 0.15;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 2.0*_BlurSize)) * 0.12;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 3.0*_BlurSize)) * 0.09;
                        sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 4.0*_BlurSize)) * 0.05;
                       
                        half4 texcol = sum;
                        return texcol;
                }
               
                ENDCG
        }
        }
        FallBack "ex2D/Alpha Blended"
}
 
_ttp://sretenka.net/
gerasim13
UNец
 
Сообщения: 14
Зарегистрирован: 20 май 2012, 22:50
Откуда: Moscow
Skype: gerasim.biz
  • Сайт

Re: Помогите дописать шейдер.

Сообщение gerasim13 06 июн 2012, 20:23

Прошу прощения, запостил не в ту ветку.
_ttp://sretenka.net/
gerasim13
UNец
 
Сообщения: 14
Зарегистрирован: 20 май 2012, 22:50
Откуда: Moscow
Skype: gerasim.biz
  • Сайт

Re: Помогите дописать шейдер.

Сообщение Neyl 06 июн 2012, 21:10

Видимо, второй пасс "затирает" результаты работы первого. Нужно установить для него режим смешивания
Синтаксис:
Используется glsl
Pass {
         Blend SrcColor OneMinusDstColor
               Name "Vertical Blur"
               ....
 

Как то так.
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17


Вернуться в Шейдерная школа

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

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