• Create Account

# Few issues with Bloom / Eye adapation / Vol.Scattering

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

### #1lipsryme  Members   -  Reputation: 1289

Like
0Likes
Like

Posted 11 January 2013 - 05:48 AM

I'm having a few issues here that are concerning bloom, eye adaption and volumetric scattering.

Both can be seen in the video below.

1. Having implemented eye adaption, how do you handle the volumetric scattering effect of e.g. the sun. Because whenever you look at it the exposure is going down and therefore also the glow of the sun and it's scattering effect. Sure the original pixels to blur are still the same but the effect suffers from the reduced exposure and bloom.

2. I'm having issues with bloom on tiny but very bright specular parts that shape the glowing pixel to basically a rather huge spherical glow.

Another issue here is that there's some parts that produce a NdotL product that is higher than zero even if they are opposite to the light direction.

### #2Ashaman73  Crossbones+   -  Reputation: 12627

Like
0Likes
Like

Posted 11 January 2013 - 06:58 AM

2. I'm having issues with bloom on tiny but very bright specular parts that shape the glowing pixel to basically a rather huge spherical glow.

I think you need to tweak it until it looks good Have you tried to reduce the blur radius ?

Another issue here is that there's some parts that produce a NdotL product that is higher than zero even if they are opposite to the light direction.

You always need to consider, that rendered normals will bend, even if the poly-surface normal will not. This often happens when using normal maps, the surface is visible (surface normal points towards the camera), but the texture/vertex normal will bend it into the screen towards the light source.

In this case a shadow map would be helpful to avoid it.

Ashaman

### #3lipsryme  Members   -  Reputation: 1289

Like
1Likes
Like

Posted 11 January 2013 - 07:39 AM

I've tried to reduce the radius but it still shapes to the glowing ball in the end when the bright pixels are small enough.

### #4lipsryme  Members   -  Reputation: 1289

Like
1Likes
Like

Posted 17 January 2013 - 07:41 AM

Using shadows helps a little for the parts that should be occluded but I still need some help on the two problems above.

I'm using the following seperable gaussian blur function for the bloom (which is exactly like being used in MJPs recent samples):

cbuffer cbBlurProperties : register(b0)
{
float2 _ScreenSize;
float _BloomBlurSigma;
};

// Calculates the gaussian blur weight for a given distance and sigmas
float CalcGaussianWeight(int sampleDist, float sigma)
{
float g = 1.0f / sqrt(2.0f * 3.14159 * sigma * sigma);
return (g * exp(-(sampleDist * sampleDist) / (2 * sigma * sigma)));
}

// Performs a gaussian blur in one direction
float4 Blur(in float2 UV, float2 texScale, float sigma)
{
float4 color = 0;
for (int i = -3; i < 3; i++)
{
float weight = CalcGaussianWeight(i, sigma);
float2 texCoord = UV;
texCoord += (i / _ScreenSize) * texScale;
float4 sample = TargetTexture.Sample(TargetTextureSampler, texCoord);
color += sample * weight;
}

return color;
}

float4 PS(VSO input) : SV_TARGET0
{
return Blur(input.UV, float2(1, 0), _BloomBlurSigma);
}	

I've tried different sigmas from 0.5 to 1.5 but at glancing angles the few pixels at the edge always lit up to extreme values and get expanded during the blur to the glowing ball (as seen in the video).

Do you think the problem might be my BRDF ?

Here's the one I'm using for the the head:

float3 N = Normal;
float3 L = normalize(LightDir);
float3 V = ViewDir;
float3 H = V + L;
float3 H_norm = normalize(H);

float4 Ls = float4(0, 0, 0, 1);
float4 Lr = float4(0, 0, 0, 1);

float3 Li = ToLinear(_LightColor.rgb) * _LightIntensity;

// Calculate cos(theta)
float NdotL = saturate(dot(N, L));

// Compute Fresnel Term (F) using Schlick's approximation
float base = 1.0f - saturate(dot(L, H_norm));
float exponential = pow(base, 5.0);
float3 F = 0.028f + (1.0f - 0.028f) * exponential;

// Add ambient light
Lr.rgb += ambient;

// Add diffuse light
Lr.rgb += NdotL * Li * shadowFactor;
Lr.rgb *= DiffuseAlbedo;
Lr.rgb *= (1.0f - F);

// Kelemen/Szirmay-Kalos (D) using a precomputed beckmann distribution
float NdotH = saturate(dot(N, H_norm));
float PH = pow(abs(2.0f * BeckmannTarget.SampleLevel(LinearSampler, float2(NdotH, SpecularPower), 0).r), 10.0f);
float ksk = max(PH / dot(H, H), 0.0f);
float D = ksk;

// Cook-Torrance approximation (G) by Kelemen and Szirmay-Kalos
float NdotV = saturate(dot(N, V)) + 0.00001f;
float LdotH = saturate(dot(L, H_norm)); + 0.00001f;
float G = 1.0f / (LdotH * LdotH);

float3 nominator = F * G * D;
float denominator = 4.0f;

Ls.rgb += nominator / denominator;
Ls.rgb *= NdotL * Li * shadowFactor; // multiply by cosine factor and incoming radiance

return Lr + Ls;

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

PARTNERS