diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
6 files changed, 133 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; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl index 35ccc65a8e..47d6c5e195 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl @@ -57,6 +57,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  in vec4 vertex_color; @@ -173,6 +176,10 @@ void main()  #endif      vec3 col = vertex_color.rgb * basecolor.rgb; +#if DEBUG_TEXCOORD +    vec3 texcoord_color = vec3(mod(original_texcoord, 1.0), 0); +    col = texcoord_color; +#endif      vec3 vNt = texture(bumpMap, normal_texcoord.xy).xyz*2.0-1.0;      float sign = vary_sign; @@ -265,6 +272,9 @@ in vec3 vary_position;  in vec2 basecolor_texcoord;  in vec2 emissive_texcoord; +#if DEBUG_TEXCOORD +in vec2 original_texcoord; +#endif  in vec4 vertex_color; @@ -292,6 +302,10 @@ void main()  #endif      color = vertex_color.rgb * basecolor.rgb; +#if DEBUG_TEXCOORD +    vec3 texcoord_color = vec3(mod(original_texcoord, 1.0), 0); +    color = texcoord_color; +#endif      // emissiveColor is the emissive color factor from GLTF and is already in linear space      vec3 colorEmissive = emissiveColor; | 
