diff options
| author | Cosmic Linden <cosmic@lindenlab.com> | 2023-02-24 13:53:55 -0800 | 
|---|---|---|
| committer | Cosmic Linden <cosmic@lindenlab.com> | 2023-02-24 13:53:55 -0800 | 
| commit | 33085b9d830ac1db280d678760b3972798aa1129 (patch) | |
| tree | 201019101a92305f22980537b8c5ab4390c9611c /indra/newview/app_settings/shaders/class1/deferred | |
| parent | a7ecfc9b1907d6ecd5fe50aeb1c41e38540b2665 (diff) | |
SL-19265: Fix precision issue with texture transforms by moving transform matrix calculation into the shader
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred')
6 files changed, 105 insertions, 51 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl index ddb53ff852..d44d1a2e6f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl @@ -44,10 +44,18 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec2 texture_base_color_scale; +uniform float texture_base_color_rotation; +uniform vec2 texture_base_color_offset; +uniform vec2 texture_normal_scale; +uniform float texture_normal_rotation; +uniform vec2 texture_normal_offset; +uniform vec2 texture_metallic_roughness_scale; +uniform float texture_metallic_roughness_rotation; +uniform vec2 texture_metallic_roughness_offset; +uniform vec2 texture_emissive_scale; +uniform float texture_emissive_rotation; +uniform vec2 texture_emissive_offset;  #ifdef HAS_SUN_SHADOW  out vec3 vary_fragcoord; @@ -60,7 +68,7 @@ in vec3 normal;  in vec4 tangent;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 normal_texcoord;  out vec2 metallic_roughness_texcoord;  out vec2 emissive_texcoord; @@ -71,7 +79,7 @@ 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); +vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform);  void main() @@ -92,10 +100,10 @@ void main()      vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip);  #endif -	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); +	base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); +	normal_texcoord = texture_transform(texcoord0, texture_normal_scale, texture_normal_rotation, texture_normal_offset, texture_matrix0); +	metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_scale, texture_metallic_roughness_rotation, texture_metallic_roughness_offset, texture_matrix0); +	emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -128,19 +136,23 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec2 texture_base_color_scale; +uniform float texture_base_color_rotation; +uniform vec2 texture_base_color_offset; +uniform vec2 texture_emissive_scale; +uniform float texture_emissive_rotation; +uniform vec2 texture_emissive_offset;  in vec3 position;  in vec4 diffuse_color;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform);  void main() @@ -150,8 +162,8 @@ void main()      gl_Position = vert;      vary_position = vert.xyz; -	basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -	emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +	base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); +	emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0);  	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl index 8dc9e02f7a..1c36aa6b50 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl @@ -37,7 +37,7 @@ out vec4 frag_color;  in vec3 vary_position;  in vec4 vertex_emissive; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 emissive_texcoord;  uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() @@ -47,7 +47,7 @@ vec3 srgb_to_linear(vec3 c);  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      { diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl index bcad1c1ceb..b73d08cf0d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl @@ -34,20 +34,24 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec2 texture_base_color_scale; +uniform float texture_base_color_rotation; +uniform vec2 texture_base_color_offset; +uniform vec2 texture_emissive_scale; +uniform float texture_emissive_rotation; +uniform vec2 texture_emissive_offset;  in vec3 position;  in vec4 emissive;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_emissive; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform);  void main()  { @@ -64,8 +68,8 @@ void main()      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, 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..6659e67a7a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -47,7 +47,7 @@ in vec3 vary_normal;  in vec3 vary_tangent;  flat in float vary_sign; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 normal_texcoord;  in vec2 metallic_roughness_texcoord;  in vec2 emissive_texcoord; @@ -62,7 +62,7 @@ uniform mat3 normal_matrix;  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      {          discard; @@ -121,7 +121,7 @@ out vec4 frag_color;  in vec3 vary_position;  in vec4 vertex_color; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 emissive_texcoord;  uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() @@ -131,7 +131,7 @@ vec3 srgb_to_linear(vec3 c);  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      {          discard; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl index f0e3d4f034..6f50aefdab 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl @@ -38,10 +38,18 @@ uniform mat4 modelview_projection_matrix;  #endif  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec2 texture_base_color_scale; +uniform float texture_base_color_rotation; +uniform vec2 texture_base_color_offset; +uniform vec2 texture_normal_scale; +uniform float texture_normal_rotation; +uniform vec2 texture_normal_offset; +uniform vec2 texture_metallic_roughness_scale; +uniform float texture_metallic_roughness_rotation; +uniform vec2 texture_metallic_roughness_offset; +uniform vec2 texture_emissive_scale; +uniform float texture_emissive_rotation; +uniform vec2 texture_emissive_offset;  in vec3 position;  in vec4 diffuse_color; @@ -49,7 +57,7 @@ in vec3 normal;  in vec4 tangent;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 normal_texcoord;  out vec2 metallic_roughness_texcoord;  out vec2 emissive_texcoord; @@ -60,7 +68,7 @@ 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); +vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform);  void main()  { @@ -78,10 +86,10 @@ void main()  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    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); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); +    normal_texcoord = texture_transform(texcoord0, texture_normal_scale, texture_normal_rotation, texture_normal_offset, texture_matrix0); +    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_scale, texture_metallic_roughness_rotation, texture_metallic_roughness_offset, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -106,29 +114,37 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec2 texture_base_color_scale; +uniform float texture_base_color_rotation; +uniform vec2 texture_base_color_offset; +uniform vec2 texture_normal_scale; +uniform float texture_normal_rotation; +uniform vec2 texture_normal_offset; +uniform vec2 texture_metallic_roughness_scale; +uniform float texture_metallic_roughness_rotation; +uniform vec2 texture_metallic_roughness_offset; +uniform vec2 texture_emissive_scale; +uniform float texture_emissive_rotation; +uniform vec2 texture_emissive_offset;  in vec3 position;  in vec4 diffuse_color;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform);  void main()  {      //transform vertex      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  -    basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0);      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 index b146c665f9..6ad317ca63 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -23,6 +23,31 @@   * $/LicenseInfo$   */ +// This shader code is taken from the sample code on the KHR_texture_transform +// spec page page, plus or minus some sign error corrections (I think because the GLSL +// matrix constructor is backwards?): +// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform +// Previously (6494eed242b1), we passed in a single, precalculated matrix +// uniform per transform into the shaders. However, that was found to produce +// small-but-noticeable discrepancies with the GLTF sample model +// "TextureTransformTest", likely due to numerical precision differences. In +// the interest of parity with other renderers, calculate the transform +// directly in the shader. -Cosmic,2023-02-24 +vec2 khr_texture_transform(vec2 texcoord, vec2 scale, float rotation, vec2 offset) +{ +    mat3 scale_mat = mat3(scale.x,0,0, 0,scale.y,0, 0,0,1); +    mat3 offset_mat = mat3(1,0,0, 0,1,0, offset.x, offset.y, 1); +    mat3 rotation_mat = mat3( +        cos(rotation),-sin(rotation), 0, +        sin(rotation), cos(rotation), 0, +                    0,             0, 1 +    ); + +    mat3 transform = offset_mat * rotation_mat * scale_mat; + +    return (transform * vec3(texcoord, 1)).xy; +} +  // 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. @@ -33,17 +58,14 @@  //     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 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, 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; +    texcoord = khr_texture_transform(texcoord, khr_gltf_scale, khr_gltf_rotation, khr_gltf_offset);      // Convert back to right-handed coordinate system      texcoord.y = 1.0 - texcoord.y;      texcoord = (sl_animation_transform * vec4(texcoord, 0, 1)).xy; | 
