Normalmap flip problem

Posted By: pesseba

Normalmap flip problem - 11/13/07 11:53

Hii...
I'm problem with a normalmap code 1.0 from wiki page
My model is mapped both sides with the same part of texture (mirrored).
But the light inside it inverts the normalmap... why??

[image]http://www.cjb.net/images.html?b212e.jpg[/image]
[img]http://images.cjb.net/b212e.jpg[/img]

I already tried to edit the normals on my model, but the problem persists. Does somebody have another normalmap code for 1.0 shader?

Thanks...
Posted By: pesseba

Re: Normalmap flip problem - 11/14/07 15:11

Hello... I'm not a shader expert... but I was trying to change this code and I think the normal calculator is wrong... (I got it from wiki)

Code:
  /***********************************************************************************************
/ Global Variables:
/***********************************************************************************************/
// Tweakables:
static const float AmbientIntensity = 1.0f; // The intensity of the ambient light.
static const float DiffuseIntensity = 1.0f; // The intensity of the diffuse light.
static const float SpecularIntensity = 1.0f; // The intensity of the specular light.
static const float SpecularPower = 8.0f; // The specular power. Used as 'glossyness' factor.
static const float4 SunColor = {0.9f, 0.9f, 0.5f, 1.0f}; // Color vector of the sunlight.

// Application fed data:
const float4x4 matWorldViewProj; // World*view*projection matrix.
const float4x4 matWorld; // World matrix.
const float4 vecAmbient; // Ambient color.
const float4 vecSunDir; // The sun direction vector.
const float4 vecViewPos; // View position.

texture entSkin1; // Color map.
sampler ColorMapSampler = sampler_state // Color map sampler.
{
Texture = <entSkin1>;
AddressU = Clamp;
AddressV = Clamp;
};

texture entSkin2; // Normal map.
sampler NormalMapSampler = sampler_state // Normal map sampler.
{
Texture = <entSkin2>;
AddressU = Clamp;
AddressV = Clamp;
};


/***********************************************************************************************
/ Vertex Shader:
/***********************************************************************************************/
void NormalMapVS( in float4 InPos : POSITION,
in float3 InNormal : NORMAL,
in float2 InTex : TEXCOORD0,
in float3 InTangent : TEXCOORD1,

out float4 OutPos : POSITION,
out float2 OutTex : TEXCOORD0,
out float3 OutViewDir: TEXCOORD1,
out float3 OutSunDir: TEXCOORD2)
{
// Transform the vertex from object space to clip space:
OutPos = mul(InPos, matWorldViewProj);

// Pass the texture coordinate to the pixel shader:
OutTex = InTex;

// Compute 3x3 matrix to transform from world space to tangent space:
half3x3 worldToTangentSpace;
worldToTangentSpace[0] = mul(InTangent, matWorld);
worldToTangentSpace[1] = mul(cross(InTangent, InNormal), matWorld);
worldToTangentSpace[2] = mul(InNormal, matWorld);

// Calculate the view direction vector in tangent space:
OutViewDir = normalize(mul(worldToTangentSpace, vecViewPos - mul(InPos, matWorld)));

// Calculate the light direction vector in tangent space:
OutSunDir = normalize(mul(worldToTangentSpace, -vecSunDir));
}


/***********************************************************************************************
/ Pixel Shader:
/***********************************************************************************************/
float4 NormalMapPS( in float2 InTex : TEXCOORD0,
in float3 InViewDir : TEXCOORD1,
in float3 InSunDir : TEXCOORD2) : COLOR
{
// Read the normal from the normal map and convert from [0..1] to [-1..1] range
float3 BumpNormal = 2 * tex2D(NormalMapSampler, InTex) - 1;

// Calculate the ambient term:
float4 Ambient = AmbientIntensity * vecAmbient;

// Calculate the diffuse term:
float4 Diffuse = DiffuseIntensity * saturate(dot(InSunDir, BumpNormal));
Diffuse *= SunColor;

// Calculate the reflection vector:
float3 R = normalize(2 * dot(BumpNormal, InSunDir) * BumpNormal - InSunDir);

// Calculate the specular term:
InViewDir = normalize(InViewDir);
float Specular = pow(saturate(dot(R, InViewDir)), SpecularPower) * SpecularIntensity;

// Fetch the pixel color from the color map:
float4 Color = tex2D(ColorMapSampler, InTex);

// Calculate final color:
return (Ambient + Diffuse + Specular) * Color;
}

/***********************************************************************************************
/ Technique:
/***********************************************************************************************/
technique SpecularTechnique
{
pass P0
{
VertexShader = compile vs_2_0 NormalMapVS();
PixelShader = compile ps_2_0 NormalMapPS();
}
}



The normals addition of vertex and pixel doesn't work on mirroed faces...

Somebody... HELP!
Posted By: pesseba

Re: Normalmap flip problem - 11/14/07 15:45

I was talking to a friend "shaderman".... He explained me what is happing..
The problem is the Tangent value from 3DGS isn't a float4 but a float3 ....

So... this

Code:
 
void CreateTangents(float3 inNormal,float3 inTangent)
{
matTangent[0] = DoPos(inTangent);
matTangent[1] = DoPos(cross(inTangent,inNormal)); // binormal
matTangent[2] = DoPos(inNormal);
}



Should be something like this

Code:
 
void CreateTangents(float3 inNormal,float3 inTangent)
{
matTangent[0] = DoPos(inTangent);
matTangent[1] = DoPos(cross(inTangent.xyz,inNormal)) * inTangent.w; //binormal
matTangent[2] = DoPos(inNormal);
}



Is this possible to correct the previous posted code?
Thanks....
Posted By: Matt_Aufderheide

Re: Normalmap flip problem - 11/14/07 19:56

I'm not sure what your friend "shaderman" is talking about.. tangents and normals are always float3 (they are direction vectors)..what would the fourth component be? Usually only position vectors are float4.

As far as the mirrored problem goes, this is common problem...you may want to adjust your mesh a bit to make sure that the vertices are welded at the seams, and try breaking the model and rewelding.

Also try searching the web for info on mirrored normal maps...there can be a number of issues causing this.

If this doesn't work, there may actually be something wrong with the tangents that A6 calculates--I'm pretty sure there is as I get better results when I calculate them myself using a dll. However I thought this was fixed in the latest versions..
Posted By: Joey

Re: Normalmap flip problem - 11/14/07 21:43

doesn't the fourth component contain the length of the vector?
Posted By: Matt_Aufderheide

Re: Normalmap flip problem - 11/15/07 02:42

Quote:

doesn't the fourth component contain the length of the vector?




No: Tangents and normals are normalized vectors (length of one). Anyway the length of a direction vector can be calculated from the xyz component..the length calculation is trivial so there is no reason in most cases to precalculate it.
Posted By: ventilator

Re: Normalmap flip problem - 11/15/07 03:08

in a7 the fourth component of the tangent contains the handedness of the bitangent. previously this information wasn't available and so mirrored uvs were problematic.
Posted By: Steempipe

Re: Normalmap flip problem - 11/15/07 03:13

Quote:

in a7 the fourth component of the tangent contains the handedness of the binormal. previously this information wasn't available and so mirrored uvs were problematic.




I have used the <cross(t, n) * t.w> and it has solved a couple of ongoing headaches I have had.
Posted By: Matt_Aufderheide

Re: Normalmap flip problem - 11/15/07 07:03

Quote:

in a7 the fourth component of the tangent contains the handedness of the bitangent. previously this information wasn't available and so mirrored uvs were problematic.




Oh, this is interesting.. I stand corrected
Posted By: pesseba

Re: Normalmap flip problem - 11/15/07 19:59

Yes Steempipe... it was I would like to listen. But could you explain better your instruction for acknex parameters? I'm not a shader expert...

Quote:

<cross(t, n) * t.w>




And Matt_Aufderheide, Could you post the dll that you talk about, please? I'm working with A6 yet...

Thanks everybody!
Posted By: Matt_Aufderheide

Re: Normalmap flip problem - 11/15/07 20:12

I dont have any specific dll for this.. i do it in my SPhere Engine dll
Posted By: Steempipe

Re: Normalmap flip problem - 11/15/07 20:44

The coordinate was added to the engine:
V7.05.1b beta - released 6-Aug-2007

So, I am sad to say that you are out of luck with A6.

I don't call createTangents... So I do this to the FX file.

Global declare:
float3x3 matTangent;

Change the vertex input struct:
float4 tangent : TEXCOORD2;


Then this code in the shader:
tbnMatrix[0] = mul(IN.tangent.xyz, matWorld);
tbnMatrix[1] = mul(cross(IN.tangent.xyz, IN.normal), matWorld)* IN.tangent.w;
tbnMatrix[2] = mul(IN.normal, matWorld);

Eric
© 2024 lite-C Forums