Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Don't forget to read Tuesday's email newsletter for your chance to win a free copy of Construct 2!


Point light attenuation


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.

  • You cannot reply to this topic
2 replies to this topic

#1 JeanP   Members   -  Reputation: 344

Like
0Likes
Like

Posted 05 January 2014 - 10:00 PM

Hi all

I'm learning OpenGL and I'm trying to write a shader for light attenuation and it's working ok except for a small problem as you can see in the image I'm getting circular strips

 

Untitled.png

 

 

Here is my fragment shader:

#version 400

smooth in vec4 diffuseColor;
smooth in vec3 normal;
smooth in vec4 cameraSpacePosition;

out vec4 outputColor;

uniform vec3 pointLightCamPos;
uniform vec4 lightIntensity;
uniform vec4 ambientIntensity;

uniform float lightAttenuation;
uniform bool bUseRSquare;


vec4 ApplyLightIntensity(in vec3 cameraSpacePos, out vec3 lightDirection)
{
	vec3 lightDifference =  pointLightCamPos - cameraSpacePos;
	float lightDistanceSqr = dot(lightDifference, lightDifference);
	lightDirection = lightDifference * inversesqrt(lightDistanceSqr);
	
	float distFactor = bUseRSquare ? lightDistanceSqr : sqrt(lightDistanceSqr);

	return lightIntensity * (1 / ( 1.0 + lightAttenuation * distFactor));
}

void main()
{
	vec3 lightDir = vec3(0.0);
	vec4 attenIntensity = ApplyLightIntensity(vec3(cameraSpacePosition), lightDir);

	float cosAngIncidence = max(dot(normalize(normal), lightDir), 0);
		
	outputColor = (diffuseColor * ambientIntensity) + 
				  (diffuseColor * attenIntensity * cosAngIncidence);
}

Is this a normal behavior? or How I can fix it?



Sponsor:

#2 Hodgman   Moderators   -  Reputation: 31056

Like
1Likes
Like

Posted 05 January 2014 - 11:50 PM

Those are called colour banding artifacts. If you open that image in a paint program and examine the colours, each band is "1" unit brightener than previous one.

e.g. 37/255, 38/255, 39/255

The problem is that we've only got 255 levels of brightness, but the human eye is much more sensitive than that.

This causes a further problem where an optical illusion makes these bands more visible than they really should be!

 

So, no, this is not your fault biggrin.png

Once you apply textures to the ground, they will make this effect almost imperceptible. Otherwise, if you aren't planning on using textures, the fallback is to implement dithering.


Edited by Hodgman, 05 January 2014 - 11:51 PM.


#3 Chris_F   Members   -  Reputation: 2438

Like
0Likes
Like

Posted 06 January 2014 - 12:12 AM

As Hodgman said, this is banding. The problem is that 8-bit is enough for images if and only if they are generated from a higher bit depth with dithering. If you render polygons directly into a 8-bit buffer or you convert high bit depth to 8-bit without dithering, then you will get banding artifacts in your gradients. See here.

 

This will be less noticeable when you factor in albedo and normal maps, but there will still be times when smooth gradients pop up, and they won't look smooth at all. As far as I know, most games don't bother to do anything about it because it's a relatively small problem (as far as most people are concerned, I personally think this is a huge issue :P) and the fix is potentially a performance issue since generating random numbers on the GPU is fairly expensive and hard to do right. It would be nice if GPUs had built in functionality for this (sort of like RdRand on modern CPU) and maybe even automatic dithering built into the API.


Edited by Chris_F, 06 January 2014 - 12:14 AM.





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