2013-08-27 3 views
1

저는 World Space에서 가벼운 방향성을 가지고 있고, 정점마다 정현파를 계산합니다 ... 그러나 정상 맵 구현에 대해서는 약간 혼란 스럽습니다. 지금 나는 이것을하고있다.노멀 맵 구현 .... 여기에 뭔가 빠졌습니까?

// Normal Map 
const float3 normalmap = (2.0f*gTextures1024.Sample(gLinearSam, float3(_in.Tex, gNormalMapIndex)).rgb) - 1.0f; 
const float3 NormalW = _in.Norm; 
const float3 TangentW = normalize(_in.TangentW.xyz - dot(_in.TangentW.xyz, _in.Norm)* _in.Norm); 
const float3 BitangentW = cross(NormalW, TangentW) * _in.TangentW.w; 

const float3x3 TBN = float3x3(TangentW, BitangentW, NormalW); 

float3 normal = normalize(mul(TBN, normalmap)); 
// Lighting Calculations 
//float4 normal = normalize(float4(_in.Norm, 0.0f)); 
float3 hvector = normalize(mul(-gDirLight.Direction.xyz, TBN) + gEyePos).xyz; 
//hvector = mul(hvector.xyz, TBN); 
float4 ambient = gDirLight.Ambient * gMaterial.Ambient; 
float4 diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f); 
float4 specular = float4(0.0f, 0.0f, 0.0f, 0.0f); 
float4 texColor = float4(1.0f, 1.0f, 1.0f, 1.0f); 

[branch] 
if(gUseTextures) 
    texColor = gTextures1024.Sample(gLinearSam, float3(_in.Tex, gDiffuseMapIndex)); 

// diffuse factor 
float diffuseFactor = saturate(dot(normal, -gDirLight.Direction.xyz)); 
[branch] 
if(diffuseFactor > 0.0f) 
{ 
    diffuse = diffuseFactor * gDirLight.Diffuse * gMaterial.Diffuse; 
    // Specular facttor & color 
    float HdotN = saturate(dot(hvector, normal)); 
    specular = gDirLight.Specular * pow(HdotN, gMaterial.Specular.w); 
} 

// Modulate with late add 
return (texColor * (ambient + diffuse)) + specular; 

여기 뭔가 잘못 되었나요? 나에 따르면 나는 세계 공간에서 보통의지도 계산을 구현하고 있으며, 모든 것이 잘 작동해야한다 ... 내가 여기서 뭔가를 놓치고 있는가?

답변

2

TBN은 벡터를 월드 공간에서 접선 공간으로 변환하는 매트릭스입니다. 따라서 접선 공간에서 조명 계산을 수행해야합니다.

법선 맵에서 얻은 법선은 이미 접선 공간 (가정)에 있습니다. 따라서 조명 방향과 눈 위치를 접선 공간으로 변환하고 평소와 같이 계산을 계속해야합니다.

0

니코, 당신 말이 맞았습니다. 그러나 나는 많은 문제를 가지고있었습니다.

문제 # 1 : 정상적으로 법선을 계산하지 않았습니다. 나는 정점 당 평균값을 사용하고 있었지만 가중치 평균과 같은 기법이 있다는 것을 인식하지 못했습니다. 이것은 모든 조명에 대해 2000 % 향상되었습니다.

문제 # 2 : 탄젠트 및 비트 탄젠트 계산이 올바르게 수행되지 않았습니다. 나는 그 지역에서 여전히 가중 평균을 할 수 있는지 알아보기 위해 개선 할 것입니다.

문제 # 3 : 조명 계산을 정확하게 수행하지 못했고 약 2 일 동안 위키 백과에서 작업 한 결과 마침내 올바르게 작동했으며 실제로 이제는 명확하게 이해합니다.

문제 # 4 : 나는 서둘러서 내가하고있는 것을 100 % 이해하지 않고 그것을하고 싶다. (그 실수를 결코 다시하지 말라.)

관련 문제