diff options
| author | Cosmic Linden <cosmic@lindenlab.com> | 2024-05-15 09:55:55 -0700 | 
|---|---|---|
| committer | Cosmic Linden <cosmic@lindenlab.com> | 2024-05-15 09:55:55 -0700 | 
| commit | ae6a402b7a26aa4ec3258b3e0b68919602e03d23 (patch) | |
| tree | bc4f9bac74ce92e398cf79015119572f1a829a7f /indra/newview/app_settings/shaders | |
| parent | 1e9e5a7b7629276d509c352699fb5891c2dc6587 (diff) | |
secondlife/viewer#1474: Remove small texture offset from PBR terrain
Diffstat (limited to 'indra/newview/app_settings/shaders')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl | 14 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl | 35 | 
2 files changed, 42 insertions, 7 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl index 489fc26e3f..d7c8fe1861 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl @@ -50,8 +50,8 @@ out vec3 vary_position;  // tangent_space_transform below.  uniform vec4[2] texture_base_color_transform; -vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); -vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); +vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform); +vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform);  void main()  { @@ -70,7 +70,7 @@ void main()      // *HACK: Should be using texture_normal_transform here. The KHR texture      // transform spec requires handling texture transforms separately for each      // individual texture. -    vary_tangent = normalize(tangent_space_transform(vec4(t, tangent.w), n, texture_base_color_transform, texture_matrix0)); +    vary_tangent = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, texture_base_color_transform));      vary_sign = tangent.w;      vary_normal = normalize(n); @@ -80,13 +80,13 @@ void main()      // separately for each individual texture.  #if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3      // xy -    vary_coords[0].xy = texture_transform(position.xy, texture_base_color_transform, texture_matrix0); +    vary_coords[0].xy = terrain_texture_transform(position.xy, texture_base_color_transform);      // yz -    vary_coords[0].zw = texture_transform(position.yz, texture_base_color_transform, texture_matrix0); +    vary_coords[0].zw = terrain_texture_transform(position.yz, texture_base_color_transform);      // (-x)z -    vary_coords[1].xy = texture_transform(position.xz * vec2(-1, 1), texture_base_color_transform, texture_matrix0); +    vary_coords[1].xy = terrain_texture_transform(position.xz * vec2(-1, 1), texture_base_color_transform);  #elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 -    vary_texcoord0.xy = texture_transform(position.xy, texture_base_color_transform, texture_matrix0); +    vary_texcoord0.xy = terrain_texture_transform(position.xy, texture_base_color_transform);  #endif      vec4 tc = vec4(texcoord1,0,1); diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl index 732333311c..7c02cb9d4a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -77,6 +77,19 @@ vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl      return texcoord;  } +// Similar to texture_transform but no offset during coordinate system +// conversion, and no texture animation support. +vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform) +{ +    vec2 texcoord = vertex_texcoord; + +    texcoord.y = -texcoord.y; +    texcoord = khr_texture_transform(texcoord, khr_gltf_transform[0].xy, khr_gltf_transform[0].z, khr_gltf_transform[1].xy); +    texcoord.y = -texcoord.y; + +    return texcoord; +} +  // Take the rotation only from both transforms and apply to the tangent. This  // accounts for the change of the topology of the normal texture when a texture  // rotation is applied to it. @@ -120,3 +133,25 @@ vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] kh      return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz);  } + +// Similar to tangent_space_transform but no no texture animation support. +vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform) +{ +    // Immediately convert to left-handed coordinate system ((0,1) -> (0, -1)) +    vec2 weights = vec2(0, -1); + +    // Apply KHR_texture_transform (rotation only) +    float khr_rotation = khr_gltf_transform[0].z; +    mat2 khr_rotation_mat = mat2( +        cos(khr_rotation),-sin(khr_rotation), +        sin(khr_rotation), cos(khr_rotation) +    ); +    weights = khr_rotation_mat * weights; + +    // Convert back to right-handed coordinate system +    weights.y = -weights.y; + +    vec3 vertex_binormal = vertex_tangent.w * cross(vertex_normal, vertex_tangent.xyz); + +    return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz); +} | 
