summaryrefslogtreecommitdiff
path: root/indra/newview/app_settings/shaders/class1
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2023-02-23 10:58:39 -0800
committerCosmic Linden <cosmic@lindenlab.com>2023-02-23 14:28:42 -0800
commit6494eed242b1cf64160e379c6d40df333deae23a (patch)
tree2ab6194d6cf1fcec77b2d28827753038f5d2bfb7 /indra/newview/app_settings/shaders/class1
parentd1531eb2cec851e663e1bdde2e2858a939a6cb81 (diff)
SL-19228: Fix GLTF texture transform rotation and add UV debug (PBR only). See textureUtilV.glsl for UV coordinate comments
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl55
5 files changed, 119 insertions, 15 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
index da27be6e7f..ee44ad874c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl
@@ -64,6 +64,9 @@ out vec2 basecolor_texcoord;
out vec2 normal_texcoord;
out vec2 metallic_roughness_texcoord;
out vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+out vec2 original_texcoord;
+#endif
out vec4 vertex_color;
@@ -71,6 +74,8 @@ out vec3 vary_tangent;
flat out float vary_sign;
out vec3 vary_normal;
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform);
+
void main()
{
@@ -90,10 +95,13 @@ void main()
vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip);
#endif
- basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
- normal_texcoord = (texture_matrix0 * vec4(texture_normal_matrix * vec3(texcoord0,1), 1)).xy;
- metallic_roughness_texcoord = (texture_matrix0 * vec4(texture_metallic_roughness_matrix * vec3(texcoord0,1), 1)).xy;
- emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
+ basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0);
+ normal_texcoord = texture_transform(texcoord0, texture_normal_matrix, texture_matrix0);
+ metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_matrix, texture_matrix0);
+ emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0);
+#if DEBUG_TEXCOORD
+ original_texcoord = texcoord0;
+#endif
#ifdef HAS_SKIN
vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz;
@@ -135,9 +143,15 @@ in vec2 texcoord0;
out vec2 basecolor_texcoord;
out vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+out vec2 original_texcoord;
+#endif
out vec4 vertex_color;
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform);
+
+
void main()
{
//transform vertex
@@ -145,8 +159,11 @@ void main()
gl_Position = vert;
vary_position = vert.xyz;
- basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
- emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
+ basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0);
+ emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0);
+#if DEBUG_TEXCOORD
+ original_texcoord = texcoord0;
+#endif
vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl
index 75b24336c5..bcad1c1ceb 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl
@@ -47,6 +47,8 @@ out vec2 emissive_texcoord;
out vec4 vertex_emissive;
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform);
+
void main()
{
#ifdef HAS_SKIN
@@ -62,8 +64,8 @@ void main()
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
#endif
- basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
- emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
+ basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0);
+ emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0);
vertex_emissive = emissive;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
index c4c5a7872b..fd2aa6eb54 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
@@ -51,6 +51,9 @@ in vec2 basecolor_texcoord;
in vec2 normal_texcoord;
in vec2 metallic_roughness_texcoord;
in vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+in vec2 original_texcoord;
+#endif
uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
@@ -69,6 +72,10 @@ void main()
}
vec3 col = vertex_color.rgb * srgb_to_linear(basecolor.rgb);
+#if DEBUG_TEXCOORD
+ vec3 texcoord_color = vec3(mod(original_texcoord, 1.0), 0);
+ col = texcoord_color;
+#endif
// from mikktspace.com
vec3 vNt = texture2D(bumpMap, normal_texcoord.xy).xyz*2.0-1.0;
@@ -123,6 +130,9 @@ in vec4 vertex_color;
in vec2 basecolor_texcoord;
in vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+in vec2 original_texcoord;
+#endif
uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
@@ -138,6 +148,10 @@ void main()
}
vec3 col = vertex_color.rgb * srgb_to_linear(basecolor.rgb);
+#if DEBUG_TEXCOORD
+ vec3 texcoord_color = vec3(mod(original_texcoord, 1.0), 0);
+ col = texcoord_color;
+#endif
vec3 emissive = emissiveColor;
emissive *= srgb_to_linear(texture2D(emissiveMap, emissive_texcoord.xy).rgb);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
index 8320640e42..aeb6b85e12 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
@@ -53,6 +53,9 @@ out vec2 basecolor_texcoord;
out vec2 normal_texcoord;
out vec2 metallic_roughness_texcoord;
out vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+out vec2 original_texcoord;
+#endif
out vec4 vertex_color;
@@ -60,6 +63,8 @@ out vec3 vary_tangent;
flat out float vary_sign;
out vec3 vary_normal;
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform);
+
void main()
{
#ifdef HAS_SKIN
@@ -75,11 +80,14 @@ void main()
//transform vertex
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
#endif
-
- basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
- normal_texcoord = (texture_matrix0 * vec4(texture_normal_matrix * vec3(texcoord0,1), 1)).xy;
- metallic_roughness_texcoord = (texture_matrix0 * vec4(texture_metallic_roughness_matrix * vec3(texcoord0,1), 1)).xy;
- emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
+
+ basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0);
+ normal_texcoord = texture_transform(texcoord0, texture_normal_matrix, texture_matrix0);
+ metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_matrix, texture_matrix0);
+ emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0);
+#if DEBUG_TEXCOORD
+ original_texcoord = texcoord0;
+#endif
#ifdef HAS_SKIN
vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz;
@@ -115,16 +123,24 @@ in vec2 texcoord0;
out vec2 basecolor_texcoord;
out vec2 emissive_texcoord;
+#if DEBUG_TEXCOORD
+out vec2 original_texcoord;
+#endif
out vec4 vertex_color;
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform);
+
void main()
{
//transform vertex
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
- emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
+ basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0);
+ emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0);
+#if DEBUG_TEXCOORD
+ original_texcoord = texcoord0;
+#endif
vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl
new file mode 100644
index 0000000000..b146c665f9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file class1/deferred/textureUtilV.glsl
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// vertex_texcoord - The UV texture coordinates sampled from the vertex at
+// runtime. Per SL convention, this is in a right-handed UV coordinate
+// system. Collada models also have right-handed UVs.
+// khr_gltf_transform - The texture transform matrix as defined in the
+// KHR_texture_transform GLTF extension spec. It assumes a left-handed UV
+// coordinate system. GLTF models also have left-handed UVs.
+// sl_animation_transform - The texture transform matrix for texture
+// animations, available through LSL script functions such as
+// LlSetTextureAnim. It assumes a right-handed UV coordinate system.
+// texcoord - The final texcoord to use for image sampling
+vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform)
+{
+ vec2 texcoord = vertex_texcoord;
+
+ // Convert to left-handed coordinate system. The offset of 1 is necessary
+ // for rotations to be applied correctly.
+ // In the future, we could bake this coordinate conversion into the uniform
+ // that khr_gltf_transform comes from, since it's applied immediately
+ // before.
+ texcoord.y = 1.0 - texcoord.y;
+ texcoord = (khr_gltf_transform * vec3(texcoord, 1.0)).xy;
+ // Convert back to right-handed coordinate system
+ texcoord.y = 1.0 - texcoord.y;
+ texcoord = (sl_animation_transform * vec4(texcoord, 0, 1)).xy;
+
+ // To make things more confusing, all SL image assets are upside-down
+ // We may need an additional sign flip here when we implement a Vulkan backend
+
+ return texcoord;
+}