[ SOLVED ] Removal Of Soft Particles Factor on Alpha Blended Particles

EDIT : Nevermind, turns out I was just being a bit stupid here, I don’t need to remove the checks, only the fade instances … :slight_smile:

Hi,

I’m working on updating a lot of shaders to work with my curved horizon shaders, and currently, I’m now looking at particles, in particular I’m updating / optimising the current alpha blended shader by removing the soft particles factor, I’m able to get rid of most of the code, but I have one small problem I need to fix before I implement my curved shader code within, first off, the code :

For the sake of clarity, I’ve commented out the lines of code I have currently removed.

Shader "playmint/particles/Particles Alpha Blended Test" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture", 2D) = "white" {}

//    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off

    SubShader {
        Pass {
  
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            #pragma multi_compile_particles
            #pragma multi_compile_fog
      
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
      
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD2;
                #endif
                UNITY_VERTEX_OUTPUT_STEREO
            };
      
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                o.vertex = UnityObjectToClipPos(v.vertex);

//                #ifdef SOFTPARTICLES_ON
//                o.projPos = ComputeScreenPos (o.vertex);
//                COMPUTE_EYEDEPTH(o.projPos.z);
//                #endif

                o.color = v.color * _TintColor;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);

//            float _InvFade;
      
            fixed4 frag (v2f i) : SV_Target
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
                float partZ = i.projPos.z;

//                float fade = saturate (_InvFade * (sceneZ-partZ));
//                i.color.a *= fade;

                #endif
          
                fixed4 col = 2.0f * i.color * tex2D(_MainTex, i.texcoord);
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}
}

Now, one particular section, if I remove the code, I break the shader, all other parts can be removed apart from this section, so, I suppose, my question is why, and if anyone can help me remove this without breaking the particle shader ?

I have commented out the section I’d like to remove :

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
//                #ifdef SOFTPARTICLES_ON
//                float4 projPos : TEXCOORD2;
//                #endif
                UNITY_VERTEX_OUTPUT_STEREO
            };

hello can you tell me how can I create a curved shader with alpha blended styled shader ?

I ended up with this :

Shader "playmint/particles/C Particles Alpha Blended" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture", 2D) = "white" {}

//    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0

}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off

    SubShader {
        Pass {
      
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            #pragma multi_compile_particles
            #pragma multi_compile_fog
          
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;

            uniform float2 _BendAmount;
            uniform float3 _BendOrigin;
            uniform float _BendFalloff;

            float4 Curve(float4 v)
            {
                // Hack : Considerably reduce amount of Bend
                _BendAmount *= .0001;

                float4 world = mul(unity_ObjectToWorld, v);
                float dist = length(world.xz-_BendOrigin.xz);
                dist = max(0, dist-_BendFalloff);

                // Distance squared
                dist = dist*dist;

                world.xy += dist*_BendAmount;
                return mul(unity_WorldToObject, world);
            }
          
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD2;
                #endif
                UNITY_VERTEX_OUTPUT_STEREO
            };
          
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {

                v.vertex = Curve(v.vertex);

                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color * _TintColor;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);

//            float _InvFade;
          
            fixed4 frag (v2f i) : SV_Target
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
                float partZ = i.projPos.z;

//                float fade = saturate (_InvFade * (sceneZ-partZ));
//                i.color.a *= fade;

                #endif
              
                fixed4 col = 2.0f * i.color * tex2D(_MainTex, i.texcoord);
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }  
}
}

You will need a curve controller attached to a GameObject in your scene :

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class curveControllerStatic : MonoBehaviour
{

    [Header("Curve Origin - Main Camera")]
    public Transform CurveOrigin;

    [Header("Curvature")]

    [Range(-500f, 500f)]
    [SerializeField]
    float curvatureX = 0f;

    [Range(-500f, 500f)]
    [SerializeField]
    float curvatureY = 0f;

    [Range(0f, 50f)]
    [SerializeField]
    [Header("Falloff Effect")]
    float falloff = 0f;

    private Vector2 bendAmount = Vector2.zero;

    // Global shader property ids
    private int bendAmountId;
    private int bendOriginId;
    private int bendFalloffId;

    void Start ()
    {
        bendAmountId = Shader.PropertyToID("_BendAmount");
        bendOriginId = Shader.PropertyToID("_BendOrigin");
        bendFalloffId = Shader.PropertyToID("_BendFalloff");
    }

    void Update ()
    {
        bendAmount.x=curvatureX;
        bendAmount.y=curvatureY;

        Shader.SetGlobalVector(bendAmountId, bendAmount);
        Shader.SetGlobalVector(bendOriginId, CurveOrigin.position);
        Shader.SetGlobalFloat(bendFalloffId, falloff);
    }
}
1 Like