[Solved] Lighting/Normal Mapping Issue

This topic is 2915 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Edit: I fixed it, the N value of NTB was being set to the the vertex normal instead of the face normal like it should have been.

Hey guys.

Here is a screen shot of the problem I am having:
http://img685.imageshack.us/img685/2928/lightproblem.jpg

To explain a bit, I currently have a grid of cubes being lit by a directional light (straight down), and two point lights. As you can see in the screen shot, the light has a repeating pattern across all the blocks for the attenuation. This issue is only present with normal mapping, so I know it's a normal mapping issue. I know there's nothing wrong with the normal map because I get the same effect when I use a blank normal map.

Below is my pixel shader code, followed by the function calculating the point light. If anyone has any ideas or suggestions, I would greatly appreciate the help.

Thanks.

float4 PS(VS_OUT pIn) : SV_Target{	// Get materials from texture maps.	float alpha    = gDiffuseMap.Sample( gTriLinearSam, pIn.texC0 ).a;		// Discard pixel if texture alpha < 0.1.  Note that we do this	// test as soon as possible so that we can potentially exit the shader 	// early, thereby skipping the rest of the shader code.	clip(alpha - 0.1f);		float4 diffuse = gDiffuseMap.Sample( gTriLinearSam, pIn.texC0 );		clip(diffuse.a - 0.15f);	float4 spec    = gSpecMap.Sample( gTriLinearSam, pIn.texC0 );	float3 normalT = gNormalMap.Sample( gTriLinearSam, pIn.texC0);			// Map [0,1] --> [0,256]	spec.a *= 256.0f;		// [0, 1] to [-1, 1]	normalT = 2.0f * normalT - 1.0f;	// NTB = YXZ	float3 N = normalize(pIn.normalW);	float3 T = normalize(pIn.tangentW - dot(pIn.tangentW, N) * N);	float3 B = cross (N, T);	float3x3 TBN = float3x3(T, B, N);	float3 bumpedNormalW = normalize(mul(normalT, TBN));	// Interpolating normal can make it not be of unit length so normalize it.    float3 normalW = normalize(pIn.normalW);    	float shadowFactor; 		if(enableShadows)		shadowFactor = CalcShadowFactor(pIn.projTexC);    	// Compute the lit color for this pixel.    SurfaceInfo v = {pIn.posW, bumpedNormalW, diffuse, spec};	float3 litColor;	for(int i = 0; i < gLightCount; i++)	{		if(gLights.type == 0)		{			if(enableShadows)				litColor += ParallelLight(v, gLights, gEyePosW, shadowFactor);			else				litColor += ParallelLight(v, gLights, gEyePosW, 1.0f);		}		else if(gLights.type == 1)			litColor += PointLight(v, gLights, gEyePosW);		else if(gLights.type == 2)			litColor += Spotlight(v, gLights, gEyePosW);	}	// Blend the fog color and the lit color.	float3 foggedColor = lerp(litColor, gFogColor, pIn.fogLerp);	    return float4(foggedColor, alpha);}

float3 PointLight(SurfaceInfo v, Light L, float3 eyePos){	float3 litColor = float3(0.0f, 0.0f, 0.0f);		// The vector from the surface to the light.	float3 lightVec = L.pos - v.pos;			// The distance from surface to light.	float d = length(lightVec);		if( d > L.range )		return float3(0.0f, 0.0f, 0.0f);			// Normalize the light vector.	lightVec /= d; 		// Add the ambient light term.	litColor += v.diffuse * L.ambient;			// Add diffuse and specular term, provided the surface is in 	// the line of site of the light.	float diffuseFactor = dot(lightVec, v.normal);	[branch]	if( diffuseFactor > 0.0f )	{		float specPower   = max(v.spec.a, 1.0f);		float3 toEye      = normalize(eyePos - v.pos);		float3 reflectVec = reflect(-lightVec, v.normal);		float specFactor  = pow(max(dot(reflectVec, toEye), 0.0f), specPower);			// diffuse and specular terms		litColor += diffuseFactor * v.diffuse * L.diffuse;		litColor += specFactor * v.spec * L.spec;	}		// attenuate	return litColor / dot(L.att, float3(1.0f, d, d*d));}

[Edited by - lifegoeson on September 25, 2010 9:43:19 PM]

1. 1
2. 2
frob
20
3. 3
Rutin
18
4. 4
5. 5

• 27
• 13
• 10
• 9
• 18
• Forum Statistics

• Total Topics
632555
• Total Posts
3007056

×