|
Normalmap flip problem
#167110
11/13/07 11:53
11/13/07 11:53
|
Joined: Dec 2005
Posts: 57 Brazil
pesseba
OP
Junior Member
|
OP
Junior Member
Joined: Dec 2005
Posts: 57
Brazil
|
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...
|
|
|
Re: Normalmap flip problem
[Re: pesseba]
#167111
11/14/07 15:11
11/14/07 15:11
|
Joined: Dec 2005
Posts: 57 Brazil
pesseba
OP
Junior Member
|
OP
Junior Member
Joined: Dec 2005
Posts: 57
Brazil
|
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!
|
|
|
Re: Normalmap flip problem
[Re: pesseba]
#167112
11/14/07 15:45
11/14/07 15:45
|
Joined: Dec 2005
Posts: 57 Brazil
pesseba
OP
Junior Member
|
OP
Junior Member
Joined: Dec 2005
Posts: 57
Brazil
|
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....
|
|
|
Re: Normalmap flip problem
[Re: Joey]
#167115
11/15/07 02:42
11/15/07 02:42
|
Joined: Oct 2003
Posts: 4,131
Matt_Aufderheide
Expert
|
Expert
Joined: Oct 2003
Posts: 4,131
|
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.
|
|
|
Re: Normalmap flip problem
[Re: ventilator]
#167117
11/15/07 03:13
11/15/07 03:13
|
Joined: Dec 2003
Posts: 1,097 Maryland, USA
Steempipe
Serious User
|
Serious User
Joined: Dec 2003
Posts: 1,097
Maryland, USA
|
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.
|
|
|
Re: Normalmap flip problem
[Re: ventilator]
#167118
11/15/07 07:03
11/15/07 07:03
|
Joined: Oct 2003
Posts: 4,131
Matt_Aufderheide
Expert
|
Expert
Joined: Oct 2003
Posts: 4,131
|
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
|
|
|
|