SHOW:
|
|
- or go back to the newest paste.
| 1 | // Better bloom for MGE XE | |
| 2 | // Does brightpass before blur and up to 4 passes of 9 weighted blur samples | |
| 3 | ||
| 4 | // Configurable variables: | |
| 5 | ||
| 6 | //More passes = higher quality, values above 4 or under 1 have no effect | |
| 7 | #define BLOOM_PASSES 4 | |
| 8 | ||
| 9 | static const float bloom_blur_radius = 2.0f; // Blur radius, higher needs more passes to look good | |
| 10 | static const float bloom_threshold = 0.9f; // Brightness threshold for blooming | |
| 11 | static const float bloom_power = 0.7f; // Overall maximum bloom blending power | |
| 12 | static const float bloom_blue = 1.3f; // How much to multiply the blue channel | |
| 13 | static const float bloom_saturation = 0.7f; // Overall bloom saturation | |
| 14 | ||
| 15 | // End of configurable variables | |
| 16 | ||
| 17 | static const float3 coef = {0.3, 0.59, 0.11};
| |
| 18 | static const float bloom_br = bloom_blur_radius * 0.001; | |
| 19 | texture lastpass; | |
| 20 | texture lastshader; | |
| 21 | ||
| 22 | sampler s0 = sampler_state { texture=<lastshader>; minfilter = linear; magfilter = linear; mipfilter = linear; addressu=mirror; addressv=mirror; };
| |
| 23 | ||
| 24 | sampler s1 = sampler_state { texture=<lastpass>; minfilter = linear; magfilter = linear; mipfilter = linear; addressu=mirror; addressv=mirror; };
| |
| 25 | ||
| 26 | ||
| 27 | float4 blurHor1(in float2 Tex : TEXCOORD) : COLOR0 | |
| 28 | {
| |
| 29 | ||
| 30 | float4 c = 0.0; | |
| 31 | ||
| 32 | //cheap blur | |
| 33 | c += tex2D(s1, float2(Tex.x - 4.0*bloom_br, Tex.y)) * 0.05; | |
| 34 | c += tex2D(s1, float2(Tex.x - 3.0*bloom_br, Tex.y)) * 0.09; | |
| 35 | c += tex2D(s1, float2(Tex.x - 2.0*bloom_br, Tex.y)) * 0.12; | |
| 36 | c += tex2D(s1, float2(Tex.x - bloom_br, Tex.y)) * 0.15; | |
| 37 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 38 | c += tex2D(s1, float2(Tex.x + bloom_br, Tex.y)) * 0.15; | |
| 39 | c += tex2D(s1, float2(Tex.x + 2.0*bloom_br, Tex.y)) * 0.12; | |
| 40 | c += tex2D(s1, float2(Tex.x + 3.0*bloom_br, Tex.y)) * 0.09; | |
| 41 | c += tex2D(s1, float2(Tex.x + 4.0*bloom_br, Tex.y)) * 0.05; | |
| 42 | ||
| 43 | return c; | |
| 44 | } | |
| 45 | ||
| 46 | float4 blurHor2(in float2 Tex : TEXCOORD) : COLOR0 | |
| 47 | {
| |
| 48 | ||
| 49 | float4 c = 0.0; | |
| 50 | ||
| 51 | //cheap blur | |
| 52 | c += tex2D(s1, float2(Tex.x - 4.0*bloom_br, Tex.y)) * 0.05; | |
| 53 | c += tex2D(s1, float2(Tex.x - 3.0*bloom_br, Tex.y)) * 0.09; | |
| 54 | c += tex2D(s1, float2(Tex.x - 2.0*bloom_br, Tex.y)) * 0.12; | |
| 55 | c += tex2D(s1, float2(Tex.x - bloom_br, Tex.y)) * 0.15; | |
| 56 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 57 | c += tex2D(s1, float2(Tex.x + bloom_br, Tex.y)) * 0.15; | |
| 58 | c += tex2D(s1, float2(Tex.x + 2.0*bloom_br, Tex.y)) * 0.12; | |
| 59 | c += tex2D(s1, float2(Tex.x + 3.0*bloom_br, Tex.y)) * 0.09; | |
| 60 | c += tex2D(s1, float2(Tex.x + 4.0*bloom_br, Tex.y)) * 0.05; | |
| 61 | ||
| 62 | return c; | |
| 63 | } | |
| 64 | ||
| 65 | float4 blurHor3(in float2 Tex : TEXCOORD) : COLOR0 | |
| 66 | {
| |
| 67 | ||
| 68 | float4 c = 0.0; | |
| 69 | ||
| 70 | //cheap blur | |
| 71 | c += tex2D(s1, float2(Tex.x - 4.0*bloom_br, Tex.y)) * 0.05; | |
| 72 | c += tex2D(s1, float2(Tex.x - 3.0*bloom_br, Tex.y)) * 0.09; | |
| 73 | c += tex2D(s1, float2(Tex.x - 2.0*bloom_br, Tex.y)) * 0.12; | |
| 74 | c += tex2D(s1, float2(Tex.x - bloom_br, Tex.y)) * 0.15; | |
| 75 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 76 | c += tex2D(s1, float2(Tex.x + bloom_br, Tex.y)) * 0.15; | |
| 77 | c += tex2D(s1, float2(Tex.x + 2.0*bloom_br, Tex.y)) * 0.12; | |
| 78 | c += tex2D(s1, float2(Tex.x + 3.0*bloom_br, Tex.y)) * 0.09; | |
| 79 | c += tex2D(s1, float2(Tex.x + 4.0*bloom_br, Tex.y)) * 0.05; | |
| 80 | ||
| 81 | return c; | |
| 82 | } | |
| 83 | ||
| 84 | float4 blurHor4(in float2 Tex : TEXCOORD) : COLOR0 | |
| 85 | {
| |
| 86 | ||
| 87 | float4 c = 0.0; | |
| 88 | ||
| 89 | //cheap blur | |
| 90 | c += tex2D(s1, float2(Tex.x - 4.0*bloom_br, Tex.y)) * 0.05; | |
| 91 | c += tex2D(s1, float2(Tex.x - 3.0*bloom_br, Tex.y)) * 0.09; | |
| 92 | c += tex2D(s1, float2(Tex.x - 2.0*bloom_br, Tex.y)) * 0.12; | |
| 93 | c += tex2D(s1, float2(Tex.x - bloom_br, Tex.y)) * 0.15; | |
| 94 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 95 | c += tex2D(s1, float2(Tex.x + bloom_br, Tex.y)) * 0.15; | |
| 96 | c += tex2D(s1, float2(Tex.x + 2.0*bloom_br, Tex.y)) * 0.12; | |
| 97 | c += tex2D(s1, float2(Tex.x + 3.0*bloom_br, Tex.y)) * 0.09; | |
| 98 | c += tex2D(s1, float2(Tex.x + 4.0*bloom_br, Tex.y)) * 0.05; | |
| 99 | ||
| 100 | return c; | |
| 101 | } | |
| 102 | ||
| 103 | float4 blurVert1(in float2 Tex : TEXCOORD) : COLOR0 | |
| 104 | {
| |
| 105 | ||
| 106 | float4 c = 0.0; | |
| 107 | ||
| 108 | c += tex2D(s1, float2(Tex.x, Tex.y - 4.0*bloom_br)) * 0.05; | |
| 109 | c += tex2D(s1, float2(Tex.x, Tex.y - 3.0*bloom_br)) * 0.09; | |
| 110 | c += tex2D(s1, float2(Tex.x, Tex.y - 2.0*bloom_br)) * 0.12; | |
| 111 | c += tex2D(s1, float2(Tex.x, Tex.y - bloom_br)) * 0.15; | |
| 112 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 113 | c += tex2D(s1, float2(Tex.x, Tex.y + bloom_br)) * 0.15; | |
| 114 | c += tex2D(s1, float2(Tex.x, Tex.y + 2.0*bloom_br)) * 0.12; | |
| 115 | c += tex2D(s1, float2(Tex.x, Tex.y + 3.0*bloom_br)) * 0.09; | |
| 116 | c += tex2D(s1, float2(Tex.x, Tex.y + 4.0*bloom_br)) * 0.05; | |
| 117 | ||
| 118 | return c; | |
| 119 | ||
| 120 | } | |
| 121 | ||
| 122 | float4 blurVert2(in float2 Tex : TEXCOORD) : COLOR0 | |
| 123 | {
| |
| 124 | ||
| 125 | float4 c = 0.0; | |
| 126 | ||
| 127 | c += tex2D(s1, float2(Tex.x, Tex.y - 4.0*bloom_br)) * 0.05; | |
| 128 | c += tex2D(s1, float2(Tex.x, Tex.y - 3.0*bloom_br)) * 0.09; | |
| 129 | c += tex2D(s1, float2(Tex.x, Tex.y - 2.0*bloom_br)) * 0.12; | |
| 130 | c += tex2D(s1, float2(Tex.x, Tex.y - bloom_br)) * 0.15; | |
| 131 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 132 | c += tex2D(s1, float2(Tex.x, Tex.y + bloom_br)) * 0.15; | |
| 133 | c += tex2D(s1, float2(Tex.x, Tex.y + 2.0*bloom_br)) * 0.12; | |
| 134 | c += tex2D(s1, float2(Tex.x, Tex.y + 3.0*bloom_br)) * 0.09; | |
| 135 | c += tex2D(s1, float2(Tex.x, Tex.y + 4.0*bloom_br)) * 0.05; | |
| 136 | ||
| 137 | return c; | |
| 138 | ||
| 139 | } | |
| 140 | ||
| 141 | float4 blurVert3(in float2 Tex : TEXCOORD) : COLOR0 | |
| 142 | {
| |
| 143 | ||
| 144 | float4 c = 0.0; | |
| 145 | ||
| 146 | c += tex2D(s1, float2(Tex.x, Tex.y - 4.0*bloom_br)) * 0.05; | |
| 147 | c += tex2D(s1, float2(Tex.x, Tex.y - 3.0*bloom_br)) * 0.09; | |
| 148 | c += tex2D(s1, float2(Tex.x, Tex.y - 2.0*bloom_br)) * 0.12; | |
| 149 | c += tex2D(s1, float2(Tex.x, Tex.y - bloom_br)) * 0.15; | |
| 150 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 151 | c += tex2D(s1, float2(Tex.x, Tex.y + bloom_br)) * 0.15; | |
| 152 | c += tex2D(s1, float2(Tex.x, Tex.y + 2.0*bloom_br)) * 0.12; | |
| 153 | c += tex2D(s1, float2(Tex.x, Tex.y + 3.0*bloom_br)) * 0.09; | |
| 154 | c += tex2D(s1, float2(Tex.x, Tex.y + 4.0*bloom_br)) * 0.05; | |
| 155 | ||
| 156 | return c; | |
| 157 | ||
| 158 | } | |
| 159 | ||
| 160 | float4 blurVert4(in float2 Tex : TEXCOORD) : COLOR0 | |
| 161 | {
| |
| 162 | ||
| 163 | float4 c = 0.0; | |
| 164 | ||
| 165 | c += tex2D(s1, float2(Tex.x, Tex.y - 4.0*bloom_br)) * 0.05; | |
| 166 | c += tex2D(s1, float2(Tex.x, Tex.y - 3.0*bloom_br)) * 0.09; | |
| 167 | c += tex2D(s1, float2(Tex.x, Tex.y - 2.0*bloom_br)) * 0.12; | |
| 168 | c += tex2D(s1, float2(Tex.x, Tex.y - bloom_br)) * 0.15; | |
| 169 | c += tex2D(s1, float2(Tex.x, Tex.y)) * 0.16; | |
| 170 | c += tex2D(s1, float2(Tex.x, Tex.y + bloom_br)) * 0.15; | |
| 171 | c += tex2D(s1, float2(Tex.x, Tex.y + 2.0*bloom_br)) * 0.12; | |
| 172 | c += tex2D(s1, float2(Tex.x, Tex.y + 3.0*bloom_br)) * 0.09; | |
| 173 | c += tex2D(s1, float2(Tex.x, Tex.y + 4.0*bloom_br)) * 0.05; | |
| 174 | ||
| 175 | return c; | |
| 176 | ||
| 177 | } | |
| 178 | ||
| 179 | float4 tB0(in float2 Tex : TEXCOORD) : COLOR0 | |
| 180 | {
| |
| 181 | float4 scene = tex2D(s0, Tex); | |
| 182 | float4 blur = tex2D(s1, Tex); | |
| 183 | ||
| 184 | // apply power mult | |
| 185 | blur *= bloom_power; | |
| 186 | ||
| 187 | // apply saturation | |
| 188 | blur.rgb = lerp(blur.rgb, dot(coef.xyz, blur.rgb), 1-saturate(bloom_saturation) ); | |
| 189 | blur.b = saturate(blur.b*bloom_blue); | |
| 190 | ||
| 191 | // apply bloom to scene | |
| 192 | scene = 1.0 - ((1.0 - scene) * (1.0 - blur)); | |
| 193 | ||
| 194 | return scene; | |
| 195 | } | |
| 196 | ||
| 197 | //First brightpass | |
| 198 | float4 brightPass(in float2 Tex : TEXCOORD) : COLOR0 | |
| 199 | {
| |
| 200 | float4 c = tex2D(s0, Tex); | |
| 201 | c = smoothstep(bloom_threshold, 1.0, c ); | |
| 202 | ||
| 203 | return saturate(c); | |
| 204 | } | |
| 205 | ||
| 206 | technique T0 < string MGEinterface = "MGE XE 0"; > | |
| 207 | {
| |
| 208 | //Brightpass before the blur | |
| 209 | pass brightPass { PixelShader = compile ps_2_0 brightPass(); }
| |
| 210 | ||
| 211 | //Main blur pass | |
| 212 | pass blurH1 { PixelShader = compile ps_2_0 blurHor1(); }
| |
| 213 | pass blurV1 { PixelShader = compile ps_2_0 blurVert1(); }
| |
| 214 | ||
| 215 | //More blur passes if desired? | |
| 216 | #if BLOOM_PASSES > 1 | |
| 217 | ||
| 218 | pass blurH2 { PixelShader = compile ps_2_0 blurHor2(); }
| |
| 219 | pass blurV2 { PixelShader = compile ps_2_0 blurVert2(); }
| |
| 220 | ||
| 221 | #if BLOOM_PASSES > 2 | |
| 222 | ||
| 223 | pass blurH3 { PixelShader = compile ps_2_0 blurHor3(); }
| |
| 224 | pass blurV3 { PixelShader = compile ps_2_0 blurVert3(); }
| |
| 225 | ||
| 226 | #if BLOOM_PASSES > 3 | |
| 227 | ||
| 228 | pass blurH4 { PixelShader = compile ps_2_0 blurHor4(); }
| |
| 229 | pass blurV4 { PixelShader = compile ps_2_0 blurVert4(); }
| |
| 230 | ||
| 231 | #endif | |
| 232 | ||
| 233 | #endif | |
| 234 | ||
| 235 | #endif | |
| 236 | ||
| 237 | - | pass ApplyBloom { PixelShader = compile ps_2_0 tB0(); } |
| 237 | + | pass ApplyBloom { PixelShader = compile ps_2_0 tB0(); }
|
| 238 | ||
| 239 | ||
| 240 | ||
| 241 | } |