Get normals and tangent synced with mikk tangent space.

This commit is contained in:
Jan Ivenz 2016-04-01 22:47:15 +02:00
parent 556aaa4396
commit 4abba9b56c
3 changed files with 15 additions and 10 deletions

View File

@ -78,9 +78,7 @@ void main(){
vec3 viewDir = normalize(g_CameraPosition - wPosition); vec3 viewDir = normalize(g_CameraPosition - wPosition);
#if defined(NORMALMAP) || defined(PARALLAXMAP) #if defined(NORMALMAP) || defined(PARALLAXMAP)
vec3 tan = normalize(wTangent.xyz); mat3 tbnMat = mat3(wTangent.xyz, wTangent.w * cross( (wNormal), (wTangent.xyz)), wNormal.xyz);
vec3 norm = normalize(wNormal);
mat3 tbnMat = mat3(tan, wTangent.w * cross(norm, tan), norm.xyz);
#endif #endif
#if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP))) #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))

View File

@ -51,10 +51,10 @@ void main(){
#endif #endif
wPosition = TransformWorld(modelSpacePos).xyz; wPosition = TransformWorld(modelSpacePos).xyz;
wNormal = TransformWorld(vec4(modelSpaceNorm,0.0)).xyz; wNormal = TransformWorldNormal(modelSpaceNorm);
#if defined(NORMALMAP) || defined(PARALLAXMAP) #if defined(NORMALMAP) || defined(PARALLAXMAP)
wTangent = vec4(TransformWorld(vec4(modelSpaceTan,0.0)).xyz,inTangent.w); wTangent = vec4(TransformWorldNormal(modelSpaceTan),inTangent.w);
#endif #endif
Color = m_BaseColor; Color = m_BaseColor;

View File

@ -60,14 +60,16 @@ vec4 TransformWorldViewProjection(vec4 position)
return g_ViewProjectionMatrix * TransformWorld(position); return g_ViewProjectionMatrix * TransformWorld(position);
} }
vec3 TransformNormal(vec3 vec) vec3 TransformWorldNormal(vec3 vec) {
{
vec4 quat = vec4(inInstanceData[0].w, inInstanceData[1].w, vec4 quat = vec4(inInstanceData[0].w, inInstanceData[1].w,
inInstanceData[2].w, inInstanceData[3].w); inInstanceData[2].w, inInstanceData[3].w);
vec3 worldNormal = vec + vec3(2.0) * cross(cross(vec, quat.xyz) + vec3(quat.w) * vec, quat.xyz); return vec + vec3(2.0) * cross(cross(vec, quat.xyz) + vec3(quat.w) * vec, quat.xyz);
}
return (g_ViewMatrix * vec4(worldNormal, 0.0)).xyz; vec3 TransformNormal(vec3 vec)
{
return (g_ViewMatrix * vec4(TransformWorldNormal(vec), 0.0)).xyz;
} }
// Prevent user from using g_** matrices which will have invalid data in this case. // Prevent user from using g_** matrices which will have invalid data in this case.
@ -97,4 +99,9 @@ vec3 TransformNormal(vec3 normal) {
return g_NormalMatrix * normal; return g_NormalMatrix * normal;
} }
vec3 TransformWorldNormal(vec3 normal) {
return normalize((g_WorldMatrix * vec4(normal,0.0)).xyz);
}
#endif #endif