ソースを参照

Fix getting world-space tangent for billboards. Closes #1678.

Lasse Öörni 9 年 前
コミット
f1cb469a34

+ 1 - 0
Docs/Urho3D.dox

@@ -1056,6 +1056,7 @@ From 1.6 to master:
 - Signatures of UIElement virtual functions OnResize() and OnPositionSet() have changed.
 - Signatures of UIElement virtual functions OnResize() and OnPositionSet() have changed.
 - UIElement::LoadChildXML() now returns the created element on success, instead of a boolean.
 - UIElement::LoadChildXML() now returns the created element on success, instead of a boolean.
 - Rendertargets have gained the ability to have automatically regenerated mipmaps. Screen buffers received from the Renderer subsystem have mipmaps off, but for manually created rendertargets the default is mipmaps on, like for ordinary textures. Use SetNumLevels(1) to disable.
 - Rendertargets have gained the ability to have automatically regenerated mipmaps. Screen buffers received from the Renderer subsystem have mipmaps off, but for manually created rendertargets the default is mipmaps on, like for ordinary textures. Use SetNumLevels(1) to disable.
+- The shader function GetWorldTangent() now returns a 4-component vector.
 */
 */
 
 
 }
 }

+ 3 - 3
bin/CoreData/Shaders/GLSL/LitSolid.glsl

@@ -54,10 +54,10 @@ void VS()
     #endif
     #endif
 
 
     #ifdef NORMALMAP
     #ifdef NORMALMAP
-        vec3 tangent = GetWorldTangent(modelMatrix);
-        vec3 bitangent = cross(tangent, vNormal) * iTangent.w;
+        vec4 tangent = GetWorldTangent(modelMatrix);
+        vec3 bitangent = cross(tangent.xyz, vNormal) * tangent.w;
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
-        vTangent = vec4(tangent, bitangent.z);
+        vTangent = vec4(tangent.xyz, bitangent.z);
     #else
     #else
         vTexCoord = GetTexCoord(iTexCoord);
         vTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif

+ 3 - 3
bin/CoreData/Shaders/GLSL/PBRLitSolid.glsl

@@ -58,10 +58,10 @@ void VS()
     #endif
     #endif
 
 
     #if defined(NORMALMAP) || defined(DIRBILLBOARD) || defined(IBL)
     #if defined(NORMALMAP) || defined(DIRBILLBOARD) || defined(IBL)
-        vec3 tangent = GetWorldTangent(modelMatrix);
-        vec3 bitangent = cross(tangent, vNormal) * iTangent.w;
+        vec4 tangent = GetWorldTangent(modelMatrix);
+        vec3 bitangent = cross(tangent.xyz, vNormal) * tangent.w;
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
-        vTangent = vec4(tangent, bitangent.z);
+        vTangent = vec4(tangent.xyz, bitangent.z);
     #else
     #else
         vTexCoord = GetTexCoord(iTexCoord);
         vTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif

+ 8 - 2
bin/CoreData/Shaders/GLSL/Transform.glsl

@@ -182,9 +182,15 @@ vec3 GetWorldNormal(mat4 modelMatrix)
     #endif
     #endif
 }
 }
 
 
-vec3 GetWorldTangent(mat4 modelMatrix)
+vec4 GetWorldTangent(mat4 modelMatrix)
 {
 {
-    return normalize(iTangent.xyz * GetNormalMatrix(modelMatrix));
+    #if defined(BILLBOARD)
+        return vec4(normalize(vec3(1.0, 0.0, 0.0) * cBillboardRot), 1.0);
+    #elif defined(DIRBILLBOARD)
+        return vec4(normalize(vec3(1.0, 0.0, 0.0) * GetNormalMatrix(modelMatrix)), 1.0);
+    #else
+        return vec4(normalize(iTangent.xyz * GetNormalMatrix(modelMatrix)), iTangent.w);
+    #endif
 }
 }
 
 
 #else
 #else

+ 3 - 3
bin/CoreData/Shaders/GLSL/Vegetation.glsl

@@ -64,10 +64,10 @@ void VS()
     #endif
     #endif
 
 
     #ifdef NORMALMAP
     #ifdef NORMALMAP
-        vec3 tangent = GetWorldTangent(modelMatrix);
-        vec3 bitangent = cross(tangent, vNormal) * iTangent.w;
+        vec4 tangent = GetWorldTangent(modelMatrix);
+        vec3 bitangent = cross(tangent.xyz, vNormal) * tangent.w;
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
         vTexCoord = vec4(GetTexCoord(iTexCoord), bitangent.xy);
-        vTangent = vec4(tangent, bitangent.z);
+        vTangent = vec4(tangent.xyz, bitangent.z);
     #else
     #else
         vTexCoord = GetTexCoord(iTexCoord);
         vTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif

+ 4 - 4
bin/CoreData/Shaders/HLSL/LitSolid.hlsl

@@ -18,7 +18,7 @@ void VS(float4 iPos : POSITION,
     #if defined(LIGHTMAP) || defined(AO)
     #if defined(LIGHTMAP) || defined(AO)
         float2 iTexCoord2 : TEXCOORD1,
         float2 iTexCoord2 : TEXCOORD1,
     #endif
     #endif
-    #if defined(NORMALMAP) || defined(TRAILFACECAM) || defined(TRAILBONE)
+    #if (defined(NORMALMAP) || defined(TRAILFACECAM) || defined(TRAILBONE)) && !defined(BILLBOARD) && !defined(DIRBILLBOARD)
         float4 iTangent : TANGENT,
         float4 iTangent : TANGENT,
     #endif
     #endif
     #ifdef SKINNED
     #ifdef SKINNED
@@ -87,10 +87,10 @@ void VS(float4 iPos : POSITION,
     #endif
     #endif
 
 
     #ifdef NORMALMAP
     #ifdef NORMALMAP
-        float3 tangent = GetWorldTangent(modelMatrix);
-        float3 bitangent = cross(tangent, oNormal) * iTangent.w;
+        float4 tangent = GetWorldTangent(modelMatrix);
+        float3 bitangent = cross(tangent.xyz, oNormal) * tangent.w;
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
-        oTangent = float4(tangent, bitangent.z);
+        oTangent = float4(tangent.xyz, bitangent.z);
     #else
     #else
         oTexCoord = GetTexCoord(iTexCoord);
         oTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif

+ 5 - 5
bin/CoreData/Shaders/HLSL/PBRLitSolid.hlsl

@@ -21,7 +21,7 @@ void VS(float4 iPos : POSITION,
     #if defined(LIGHTMAP) || defined(AO)
     #if defined(LIGHTMAP) || defined(AO)
         float2 iTexCoord2 : TEXCOORD1,
         float2 iTexCoord2 : TEXCOORD1,
     #endif
     #endif
-    #if defined(NORMALMAP)|| defined(IBL) || defined(TRAILFACECAM) || defined(TRAILBONE)
+    #if (defined(NORMALMAP)|| defined(IBL) || defined(TRAILFACECAM) || defined(TRAILBONE)) && !defined(BILLBOARD) && !defined(DIRBILLBOARD)
         float4 iTangent : TANGENT,
         float4 iTangent : TANGENT,
     #endif
     #endif
     #ifdef SKINNED
     #ifdef SKINNED
@@ -90,10 +90,10 @@ void VS(float4 iPos : POSITION,
     #endif
     #endif
 
 
     #if defined(NORMALMAP) || defined(IBL)
     #if defined(NORMALMAP) || defined(IBL)
-        const float3 tangent = GetWorldTangent(modelMatrix);
-        const float3 bitangent = cross(tangent, oNormal) * iTangent.w;
+        const float4 tangent = GetWorldTangent(modelMatrix);
+        const float3 bitangent = cross(tangent.xyz, oNormal) * tangent.w;
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
-        oTangent = float4(tangent, bitangent.z);
+        oTangent = float4(tangent.xyz, bitangent.z);
     #else
     #else
         oTexCoord = GetTexCoord(iTexCoord);
         oTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif
@@ -226,7 +226,7 @@ void PS(
     diffColor.rgb = diffColor.rgb - diffColor.rgb * metalness; // Modulate down the diffuse
     diffColor.rgb = diffColor.rgb - diffColor.rgb * metalness; // Modulate down the diffuse
 
 
     // Get normal
     // Get normal
-    #if defined(NORMALMAP) || defined(DIRBILLBOARD) || defined(IBL)
+    #if defined(NORMALMAP) || defined(IBL)
         const float3 tangent = normalize(iTangent.xyz);
         const float3 tangent = normalize(iTangent.xyz);
         const float3 bitangent = normalize(float3(iTexCoord.zw, iTangent.w));
         const float3 bitangent = normalize(float3(iTexCoord.zw, iTangent.w));
         const float3x3 tbn = float3x3(tangent, bitangent, iNormal);
         const float3x3 tbn = float3x3(tangent, bitangent, iNormal);

+ 8 - 1
bin/CoreData/Shaders/HLSL/Transform.hlsl

@@ -137,7 +137,14 @@ float3 GetTrailNormal(float4 iPos, float3 iParentPos, float3 iForward)
     #define GetWorldNormal(modelMatrix) normalize(mul(iNormal, (float3x3)modelMatrix))
     #define GetWorldNormal(modelMatrix) normalize(mul(iNormal, (float3x3)modelMatrix))
 #endif
 #endif
 
 
-#define GetWorldTangent(modelMatrix) normalize(mul(iTangent.xyz, (float3x3)modelMatrix))
+#if defined(BILLBOARD)
+    #define GetWorldTangent(modelMatrix) float4(normalize(mul(float3(1.0, 0.0, 0.0), cBillboardRot)), 1.0)
+#elif defined(DIRBILLBOARD)
+    #define GetWorldTangent(modelMatrix) float4(normalize(mul(float3(1.0, 0.0, 0.0), (float3x3)modelMatrix)), 1.0)
+#else
+    #define GetWorldTangent(modelMatrix) float4(normalize(mul(iTangent.xyz, (float3x3)modelMatrix)), iTangent.w)
+#endif
+
 #endif
 #endif
 
 
 #ifdef COMPILEPS
 #ifdef COMPILEPS

+ 4 - 4
bin/CoreData/Shaders/HLSL/Vegetation.hlsl

@@ -39,7 +39,7 @@ void VS(float4 iPos : POSITION,
     #if defined(LIGHTMAP) || defined(AO)
     #if defined(LIGHTMAP) || defined(AO)
         float2 iTexCoord2 : TEXCOORD1,
         float2 iTexCoord2 : TEXCOORD1,
     #endif
     #endif
-    #if defined(NORMALMAP) || defined(TRAILFACECAM) || defined(TRAILBONE)
+    #if (defined(NORMALMAP) || defined(TRAILFACECAM) || defined(TRAILBONE)) && !defined(BILLBOARD) && !defined(DIRBILLBOARD)
         float4 iTangent : TANGENT,
         float4 iTangent : TANGENT,
     #endif
     #endif
     #ifdef SKINNED
     #ifdef SKINNED
@@ -115,10 +115,10 @@ void VS(float4 iPos : POSITION,
     #endif
     #endif
 
 
     #ifdef NORMALMAP
     #ifdef NORMALMAP
-        float3 tangent = GetWorldTangent(modelMatrix);
-        float3 bitangent = cross(tangent, oNormal) * iTangent.w;
+        float4 tangent = GetWorldTangent(modelMatrix);
+        float3 bitangent = cross(tangent.xyz, oNormal) * tangent.w;
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
         oTexCoord = float4(GetTexCoord(iTexCoord), bitangent.xy);
-        oTangent = float4(tangent, bitangent.z);
+        oTangent = float4(tangent.xyz, bitangent.z);
     #else
     #else
         oTexCoord = GetTexCoord(iTexCoord);
         oTexCoord = GetTexCoord(iTexCoord);
     #endif
     #endif