Question by
jordaneden · May 09, 2016 at 03:54 PM ·
shaderparticle systemfoghdralpha-blend
How to make this shader for a particle system work with HDR?
I'm using this shader for a particle system which when coupled with HDR becomes artifacted/inverted (alpha-blending issues I think). Judging by similar issues others have had, I'm hoping someone here knows how to rectify this shader script.
Shader "LemonSpawn/LazyFog" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Scale ("Scale", Range(0,5)) = 1
_Intensity ("Intensity", Range(0,1)) = 0.5
_Alpha ("Alpha", Range(0,2.5)) = 0.75
_AlphaSub ("AlphaSub", Range(0,1)) = 0.0
_Pow ("Pow", Range(0,4)) = 1.0
}
SubShader {
Tags {"Queue"="Transparent+101" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 400
Lighting On
Cull Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma target 3.0
#pragma fragmentoption ARB_precision_hint_fastest
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "AutoLight.cginc"
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _Color;
float _Scale;
float _Intensity;
float _Alpha;
float _AlphaSub;
float _Pow;
struct v2f
{
float4 pos : POSITION;
float4 texcoord : TEXCOORD0;
float3 normal : TEXCOORD1;
float4 color: TEXCOORD2;
float2 uv : TEXCOORD3;
float3 worldPosition: TEXCOORD4;
};
v2f vert (appdata_full v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
o.normal = normalize(v.normal).xyz;
o.texcoord = v.texcoord;
o.worldPosition = mul (_Object2World, v.vertex).xyz;
o.color =v.color;
// TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}
fixed4 frag(v2f IN) : COLOR {
float3 worldSpacePosition = IN.worldPosition;
float3 N;
float3 distScale = 0.5;
float3 viewDirection = normalize(_WorldSpaceCameraPos - worldSpacePosition);
float dist = clamp(pow(length(0.1*distScale*(_WorldSpaceCameraPos - worldSpacePosition)),1.0),0,1);
float scale = 5;
float shadowscale = 1;
float4 c = tex2D(_MainTex, IN.uv*_Scale);
float xx = c.r*_Intensity;
xx = pow(xx,_Pow);
c.a = c.r;
c.rgb = float3(xx*_Color.r,xx*_Color.g,xx*_Color.b);
c.a *= IN.color.a-2.5*length(IN.uv-float2(0.5, 0.5));
c.a*=_Alpha;
c.a-=_AlphaSub;
return c;
}
ENDCG
}
}
}
Comment
Answer by jordaneden · May 09, 2016 at 04:03 PM
I've managed to get acceptable results by changing line 19:
Blend SrcAlpha OneMinusSrcAlpha
To:
Blend One One
To confirm details, I was using the SE Natural Bloom asset, which required the HDR camera for full effect, both of which seemed to conflict with the fog shader used in the LazyFog asset. It's by no means a perfect solution, but for now it shall suffice. Anyone with a better idea is welcome to have a crack.