diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
40 files changed, 1897 insertions, 695 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl index d9a6c9e5f1..43863dd37a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file avatarEyesV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -26,6 +26,7 @@  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; +uniform mat4 modelview_matrix;  in vec3 position;  in vec3 normal; @@ -35,14 +36,16 @@ in vec2 texcoord0;  out vec3 vary_normal;  out vec4 vertex_color;  out vec2 vary_texcoord0; +out vec3 vary_position;  void main()  { -    //transform vertex -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - -    vary_normal = normalize(normal_matrix * normal); +	//transform vertex +	vary_position = (modelview_matrix * vec4(position.xyz, 1.0)).xyz; +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	 +	vary_normal = normalize(normal_matrix * normal); -    vertex_color = diffuse_color; +	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index 63d8e12e62..db7597dd74 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -1,31 +1,31 @@ -/** +/**    * @file avatarF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */  /*[EXTRA_CODE_HERE]*/ -out vec4 frag_data[3]; +out vec4 frag_data[4];  uniform sampler2D diffuseMap; @@ -33,21 +33,25 @@ uniform float minimum_alpha;  in vec3 vary_normal;  in vec2 vary_texcoord0; +in vec3 vary_position; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 pos); -void main() +void main()   { -    vec4 diff = texture(diffuseMap, vary_texcoord0.xy); - -    if (diff.a < minimum_alpha) -    { -        discard; -    } - -    frag_data[0] = vec4(diff.rgb, 0.0); -    frag_data[1] = vec4(0,0,0,0); -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +    mirrorClip(vary_position); + +	vec4 diff = texture(diffuseMap, vary_texcoord0.xy); +	 +	if (diff.a < minimum_alpha) +	{ +		discard; +	} +	 +	frag_data[0] = vec4(diff.rgb, 0.0); +	frag_data[1] = vec4(0,0,0,0); +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS); +    frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index 74d16592de..5cc2846156 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file avatarV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ - +   uniform mat4 projection_matrix;  in vec3 position; @@ -35,29 +35,31 @@ in vec4 weight;  out vec3 vary_normal;  out vec2 vary_texcoord0; +out vec3 vary_position;  void main()  { -    vary_texcoord0 = texcoord0; - -    vec4 pos; -    vec3 norm; - -    vec4 pos_in = vec4(position.xyz, 1.0); -    mat4 trans = getSkinnedTransform(); -    pos.x = dot(trans[0], pos_in); -    pos.y = dot(trans[1], pos_in); -    pos.z = dot(trans[2], pos_in); -    pos.w = 1.0; - -    norm.x = dot(trans[0].xyz, normal); -    norm.y = dot(trans[1].xyz, normal); -    norm.z = dot(trans[2].xyz, normal); -    norm = normalize(norm); - -    vary_normal = norm; - -    gl_Position = projection_matrix * pos; +	vary_texcoord0 = texcoord0; +				 +	vec4 pos; +	vec3 norm; +	 +	vec4 pos_in = vec4(position.xyz, 1.0); +	mat4 trans = getSkinnedTransform(); +	pos.x = dot(trans[0], pos_in); +	pos.y = dot(trans[1], pos_in); +	pos.z = dot(trans[2], pos_in); +	pos.w = 1.0; +	 +	norm.x = dot(trans[0].xyz, normal); +	norm.y = dot(trans[1].xyz, normal); +	norm.z = dot(trans[2].xyz, normal); +	norm = normalize(norm); +	 +	vary_normal = norm; +	 +    vary_position = pos.xyz; +	gl_Position = projection_matrix * pos;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index 19fc660c2d..8627ab1852 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file blurLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -40,18 +40,18 @@ uniform float kern_scale;  in vec2 vary_fragcoord;  vec4 getPosition(vec2 pos_screen); -vec3 getNorm(vec2 pos_screen); +vec4 getNorm(vec2 pos_screen); -void main() +void main()   {      vec2 tc = vary_fragcoord.xy; -    vec3 norm = getNorm(tc); +    vec4 norm = getNorm(tc);      vec3 pos = getPosition(tc).xyz;      vec4 ccol = texture(lightMap, tc).rgba; - +        vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);      dlt /= max(-pos.z*dist_factor, 1.0); - +          vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'      vec4 col = defined_weight.xyxx * ccol; @@ -75,15 +75,15 @@ void main()      k[1] = (k[0]+k[2])*0.5f;      k[3] = (k[2]+k[4])*0.5f;      k[5] = (k[4]+k[6])*0.5f; - +          for (int i = 1; i < 7; i++)      {          vec2 samptc = tc + k[i].z*dlt*2.0;          samptc /= screen_res; -        vec3 samppos = getPosition(samptc).xyz; +        vec3 samppos = getPosition(samptc).xyz;           float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane - +                  if (d*d <= pointplanedist_tolerance_pow2)          {              col += texture(lightMap, samptc)*k[i].xyxx; @@ -95,10 +95,10 @@ void main()      {          vec2 samptc = tc - k[i].z*dlt*2.0;          samptc /= screen_res; -        vec3 samppos = getPosition(samptc).xyz; +        vec3 samppos = getPosition(samptc).xyz;           float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane - +                  if (d*d <= pointplanedist_tolerance_pow2)          {              col += texture(lightMap, samptc)*k[i].xyxx; @@ -108,7 +108,7 @@ void main()      col /= defined_weight.xyxx;      //col.y *= col.y; - +          frag_color = max(col, vec4(0));  #ifdef IS_AMD_CARD diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl index 11deecafbb..8483f257fa 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl @@ -1,30 +1,30 @@ -/** +/**    * @file bumpF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */  /*[EXTRA_CODE_HERE]*/ - +   out vec4 frag_data[4];  uniform float minimum_alpha; @@ -37,29 +37,31 @@ in vec3 vary_mat2;  in vec4 vertex_color;  in vec2 vary_texcoord0; +in vec3 vary_position; -vec2 encode_normal(vec3 n); - -void main() +void mirrorClip(vec3 pos); +void main()   { -    vec4 col = texture(diffuseMap, vary_texcoord0.xy); - -    if(col.a < minimum_alpha) -    { -        discard; -    } -        col *= vertex_color; - -        vec3 norm = texture(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0; +    mirrorClip(vary_position); -        vec3 tnorm = vec3(dot(norm,vary_mat0), -              dot(norm,vary_mat1), -              dot(norm,vary_mat2)); +	vec4 col = texture(diffuseMap, vary_texcoord0.xy); +	 +	if(col.a < minimum_alpha) +	{ +		discard; +    }		 +		col *= vertex_color; +		 +		vec3 norm = texture(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0; -        frag_data[0] = vec4(col.rgb, 0.0); -        frag_data[1] = vertex_color.aaaa; // spec -        //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested -        vec3 nvn = normalize(tnorm); -        frag_data[2] = vec4(encode_normal(nvn), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS); -        frag_data[3] = vec4(0); +		vec3 tnorm = vec3(dot(norm,vary_mat0), +			  dot(norm,vary_mat1), +			  dot(norm,vary_mat2)); +						 +		frag_data[0] = vec4(col.rgb, 0.0); +		frag_data[1] = vertex_color.aaaa; // spec +		//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested +		vec3 nvn = normalize(tnorm); +		frag_data[2] = vec4(nvn, GBUFFER_FLAG_HAS_ATMOS); +        frag_data[3] = vec4(vertex_color.a, 0, 0, 0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl index 4ac757be65..74319349f6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl @@ -1,28 +1,29 @@ -/** +/**    * @file bumpV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ +uniform mat4 modelview_matrix;  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; @@ -38,36 +39,38 @@ out vec3 vary_mat1;  out vec3 vary_mat2;  out vec4 vertex_color;  out vec2 vary_texcoord0; +out vec3 vary_position;  #ifdef HAS_SKIN  mat4 getObjectSkinnedTransform();  uniform mat4 projection_matrix; -uniform mat4 modelview_matrix;  #endif  void main()  { -    //transform vertex +	//transform vertex  #ifdef HAS_SKIN      mat4 mat = getObjectSkinnedTransform(); -    mat = modelview_matrix * mat; -    vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz; -    gl_Position = projection_matrix*vec4(pos, 1.0); +	mat = modelview_matrix * mat; +	vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz; +    vary_position = pos; +	gl_Position = projection_matrix*vec4(pos, 1.0); -    vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz); -    vec3 t = normalize((mat * vec4(tangent.xyz+position.xyz, 1.0)).xyz-pos.xyz); +	vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz); +	vec3 t = normalize((mat * vec4(tangent.xyz+position.xyz, 1.0)).xyz-pos.xyz);  #else -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); -    vec3 n = normalize(normal_matrix * normal); -    vec3 t = normalize(normal_matrix * tangent.xyz); +    vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  +	vec3 n = normalize(normal_matrix * normal); +	vec3 t = normalize(normal_matrix * tangent.xyz);  #endif -    vec3 b = cross(n, t) * tangent.w; -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - -    vary_mat0 = vec3(t.x, b.x, n.x); -    vary_mat1 = vec3(t.y, b.y, n.y); -    vary_mat2 = vec3(t.z, b.z, n.z); +	vec3 b = cross(n, t) * tangent.w; +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -    vertex_color = diffuse_color; +	vary_mat0 = vec3(t.x, b.x, n.x); +	vary_mat1 = vec3(t.y, b.y, n.y); +	vary_mat2 = vec3(t.z, b.z, n.z); +	 +	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 5ef3d63eb2..f6696e270c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file class1/deferred/deferredUtil.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -50,6 +50,7 @@ SOFTWARE.  uniform sampler2D   normalMap;  uniform sampler2D   depthMap; +uniform sampler2D emissiveRect;  uniform sampler2D projectionMap; // rgba  uniform sampler2D brdfLut; @@ -140,40 +141,20 @@ vec2 getScreenCoordinate(vec2 screenpos)      return sc - vec2(1.0, 1.0);  } -// See: https://aras-p.info/texts/CompactNormalStorage.html -//      Method #4: Spheremap Transform, Lambert Azimuthal Equal-Area projection -vec3 getNorm(vec2 screenpos) -{ -   vec2 enc = texture(normalMap, screenpos.xy).xy; -   vec2 fenc = enc*4-2; -   float f = dot(fenc,fenc); -   float g = sqrt(1-f/4); -   vec3 n; -   n.xy = fenc*g; -   n.z = 1-f/2; -   return n; -} - -vec3 getNormalFromPacked(vec4 packedNormalEnvIntensityFlags) +vec4 getNorm(vec2 screenpos)  { -   vec2 enc = packedNormalEnvIntensityFlags.xy; -   vec2 fenc = enc*4-2; -   float f = dot(fenc,fenc); -   float g = sqrt(1-f/4); -   vec3 n; -   n.xy = fenc*g; -   n.z = 1-f/2; -   return normalize(n); // TODO: Is this normalize redundant? +    return texture(normalMap, screenpos.xy);  }  // return packedNormalEnvIntensityFlags since GBUFFER_FLAG_HAS_PBR needs .w  // See: C++: addDeferredAttachments(), GLSL: softenLightF  vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity)  { -    vec4 packedNormalEnvIntensityFlags = texture(normalMap, screenpos.xy); -    n = getNormalFromPacked( packedNormalEnvIntensityFlags ); -    envIntensity = packedNormalEnvIntensityFlags.z; -    return packedNormalEnvIntensityFlags; +    vec4 norm = texture(normalMap, screenpos.xy); +    n = norm.xyz; +    envIntensity = texture(emissiveRect, screenpos.xy).r; + +    return norm;  }  // get linear depth value given a depth buffer sample d and znear and zfar values @@ -385,14 +366,14 @@ vec3 pbrIbl(vec3 diffuseColor,              float perceptualRough)  {      // retrieve a scale and bias to F0. See [1], Figure 3 -    vec2 brdf = BRDF(clamp(nv, 0, 1), 1.0-perceptualRough); -    vec3 diffuseLight = irradiance; -    vec3 specularLight = radiance; - -    vec3 diffuse = diffuseLight * diffuseColor; -    vec3 specular = specularLight * (specularColor * brdf.x + brdf.y); +	vec2 brdf = BRDF(clamp(nv, 0, 1), 1.0-perceptualRough); +	vec3 diffuseLight = irradiance; +	vec3 specularLight = radiance; +     +	vec3 diffuse = diffuseLight * diffuseColor; +	vec3 specular = specularLight * (specularColor * brdf.x + brdf.y); -    return (diffuse + specular) * ao; +	return (diffuse + specular) * ao;  } @@ -401,18 +382,18 @@ vec3 pbrIbl(vec3 diffuseColor,  // of the shading terms, outlined in the Readme.MD Appendix.  struct PBRInfo  { -    float NdotL;                  // cos angle between normal and light direction -    float NdotV;                  // cos angle between normal and view direction -    float NdotH;                  // cos angle between normal and half vector -    float LdotH;                  // cos angle between light direction and half vector -    float VdotH;                  // cos angle between view direction and half vector -    float perceptualRoughness;    // roughness value, as authored by the model creator (input to shader) -    float metalness;              // metallic value at the surface -    vec3 reflectance0;            // full reflectance color (normal incidence angle) -    vec3 reflectance90;           // reflectance color at grazing angle -    float alphaRoughness;         // roughness mapped to a more linear change in the roughness (proposed by [2]) -    vec3 diffuseColor;            // color contribution from diffuse lighting -    vec3 specularColor;           // color contribution from specular lighting +	float NdotL;                  // cos angle between normal and light direction +	float NdotV;                  // cos angle between normal and view direction +	float NdotH;                  // cos angle between normal and half vector +	float LdotH;                  // cos angle between light direction and half vector +	float VdotH;                  // cos angle between view direction and half vector +	float perceptualRoughness;    // roughness value, as authored by the model creator (input to shader) +	float metalness;              // metallic value at the surface +	vec3 reflectance0;            // full reflectance color (normal incidence angle) +	vec3 reflectance90;           // reflectance color at grazing angle +	float alphaRoughness;         // roughness mapped to a more linear change in the roughness (proposed by [2]) +	vec3 diffuseColor;            // color contribution from diffuse lighting +	vec3 specularColor;           // color contribution from specular lighting  };  // Basic Lambertian diffuse @@ -420,14 +401,14 @@ struct PBRInfo  // See also [1], Equation 1  vec3 diffuse(PBRInfo pbrInputs)  { -    return pbrInputs.diffuseColor / M_PI; +	return pbrInputs.diffuseColor / M_PI;  }  // The following equation models the Fresnel reflectance term of the spec equation (aka F())  // Implementation of fresnel from [4], Equation 15  vec3 specularReflection(PBRInfo pbrInputs)  { -    return pbrInputs.reflectance0 + (pbrInputs.reflectance90 - pbrInputs.reflectance0) * pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0); +	return pbrInputs.reflectance0 + (pbrInputs.reflectance90 - pbrInputs.reflectance0) * pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0);  }  // This calculates the specular geometric attenuation (aka G()), @@ -436,13 +417,13 @@ vec3 specularReflection(PBRInfo pbrInputs)  // alphaRoughness as input as originally proposed in [2].  float geometricOcclusion(PBRInfo pbrInputs)  { -    float NdotL = pbrInputs.NdotL; -    float NdotV = pbrInputs.NdotV; -    float r = pbrInputs.alphaRoughness; +	float NdotL = pbrInputs.NdotL; +	float NdotV = pbrInputs.NdotV; +	float r = pbrInputs.alphaRoughness; -    float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL))); -    float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV))); -    return attenuationL * attenuationV; +	float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL))); +	float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV))); +	return attenuationL * attenuationV;  }  // The following equation(s) model the distribution of microfacet normals across the area being drawn (aka D()) @@ -450,13 +431,13 @@ float geometricOcclusion(PBRInfo pbrInputs)  // Follows the distribution function recommended in the SIGGRAPH 2013 course notes from EPIC Games [1], Equation 3.  float microfacetDistribution(PBRInfo pbrInputs)  { -    float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness; -    float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0; -    return roughnessSq / (M_PI * f * f); +	float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness; +	float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0; +	return roughnessSq / (M_PI * f * f);  } -vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, -                    float perceptualRoughness, +vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  +                    float perceptualRoughness,                       float metallic,                      vec3 n, // normal                      vec3 v, // surface point to camera @@ -464,53 +445,53 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  {      // make sure specular highlights from punctual lights don't fall off of polished surfaces      perceptualRoughness = max(perceptualRoughness, 8.0/255.0); - -    float alphaRoughness = perceptualRoughness * perceptualRoughness; - -    // Compute reflectance. -    float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b); - -    // For typical incident reflectance range (between 4% to 100%) set the grazing reflectance to 100% for typical fresnel effect. -    // For very low reflectance range on highly diffuse objects (below 4%), incrementally reduce grazing reflecance to 0%. -    float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0); -    vec3 specularEnvironmentR0 = specularColor.rgb; -    vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90; - -    vec3 h = normalize(l+v);                        // Half vector between both l and v -    vec3 reflection = -normalize(reflect(v, n)); -    reflection.y *= -1.0f; - -    float NdotL = clamp(dot(n, l), 0.001, 1.0); -    float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0); -    float NdotH = clamp(dot(n, h), 0.0, 1.0); -    float LdotH = clamp(dot(l, h), 0.0, 1.0); -    float VdotH = clamp(dot(v, h), 0.0, 1.0); - -    PBRInfo pbrInputs = PBRInfo( -        NdotL, -        NdotV, -        NdotH, -        LdotH, -        VdotH, -        perceptualRoughness, -        metallic, -        specularEnvironmentR0, -        specularEnvironmentR90, -        alphaRoughness, -        diffuseColor, -        specularColor -    ); - -    // Calculate the shading terms for the microfacet specular shading model -    vec3 F = specularReflection(pbrInputs); -    float G = geometricOcclusion(pbrInputs); -    float D = microfacetDistribution(pbrInputs); - -    // Calculation of analytical lighting contribution -    vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs); -    vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV); -    // Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law) -    vec3 color = NdotL * (diffuseContrib + specContrib); +     +	float alphaRoughness = perceptualRoughness * perceptualRoughness; + +	// Compute reflectance. +	float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b); + +	// For typical incident reflectance range (between 4% to 100%) set the grazing reflectance to 100% for typical fresnel effect. +	// For very low reflectance range on highly diffuse objects (below 4%), incrementally reduce grazing reflecance to 0%. +	float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0); +	vec3 specularEnvironmentR0 = specularColor.rgb; +	vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90; + +	vec3 h = normalize(l+v);                        // Half vector between both l and v +	vec3 reflection = -normalize(reflect(v, n)); +	reflection.y *= -1.0f; + +	float NdotL = clamp(dot(n, l), 0.001, 1.0); +	float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0); +	float NdotH = clamp(dot(n, h), 0.0, 1.0); +	float LdotH = clamp(dot(l, h), 0.0, 1.0); +	float VdotH = clamp(dot(v, h), 0.0, 1.0); + +	PBRInfo pbrInputs = PBRInfo( +		NdotL, +		NdotV, +		NdotH, +		LdotH, +		VdotH, +		perceptualRoughness, +		metallic, +		specularEnvironmentR0, +		specularEnvironmentR90, +		alphaRoughness, +		diffuseColor, +		specularColor +	); + +	// Calculate the shading terms for the microfacet specular shading model +	vec3 F = specularReflection(pbrInputs); +	float G = geometricOcclusion(pbrInputs); +	float D = microfacetDistribution(pbrInputs); + +	// Calculation of analytical lighting contribution +	vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs); +	vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV); +	// Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law) +	vec3 color = NdotL * (diffuseContrib + specContrib);      return clamp(color, vec3(0), vec3(10));  } @@ -528,9 +509,9 @@ vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v,      vec3 color = vec3(0);      float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0); - +          color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness); - +          color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir)) * sunlit * 3.0 * scol; //magic number to balance with legacy materials      color += colorEmissive; diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl index c2fb3201f4..82d5d363d2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file diffuseAlphaMaskF.glsl   *   * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2011, 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$   */ @@ -31,25 +31,29 @@ uniform float minimum_alpha;  uniform sampler2D diffuseMap; +in vec3 vary_position; +  in vec3 vary_normal;  in vec4 vertex_color;  in vec2 vary_texcoord0; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 pos); -void main() +void main()   { -    vec4 col = texture(diffuseMap, vary_texcoord0.xy) * vertex_color; - -    if (col.a < minimum_alpha) -    { -        discard; -    } - -    frag_data[0] = vec4(col.rgb, 0.0); -    frag_data[1] = vec4(0,0,0,0); // spec -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +    mirrorClip(vary_position); + +	vec4 col = texture(diffuseMap, vary_texcoord0.xy) * vertex_color; +	 +	if (col.a < minimum_alpha) +	{ +		discard; +	} + +	frag_data[0] = vec4(col.rgb, 0.0); +	frag_data[1] = vec4(0,0,0,0); // spec +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl index dce1f91bc3..788ea633fc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file diffuseAlphaMaskIndexedF.glsl   *   * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2011, 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$   */ @@ -28,26 +28,29 @@  out vec4 frag_data[4];  in vec3 vary_normal; +in vec3 vary_position;  uniform float minimum_alpha;  in vec4 vertex_color;  in vec2 vary_texcoord0; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 pos); -void main() +void main()   { -    vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color; - -    if (col.a < minimum_alpha) -    { -        discard; -    } - -    frag_data[0] = vec4(col.rgb, 0.0); -    frag_data[1] = vec4(0,0,0,0); -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +    mirrorClip(vary_position); + +	vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color; +	 +	if (col.a < minimum_alpha) +	{ +		discard; +	} +	 +	frag_data[0] = vec4(col.rgb, 0.0); +	frag_data[1] = vec4(0,0,0,0); +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl index 1fc719dde5..22e6d60419 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file diffuseAlphaMaskNoColorF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2005, 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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_data[4]; @@ -34,21 +34,19 @@ uniform sampler2D diffuseMap;  in vec3 vary_normal;  in vec2 vary_texcoord0; -vec2 encode_normal(vec3 n); - -void main() +void main()   { -    vec4 col = texture(diffuseMap, vary_texcoord0.xy); - -    if (col.a < minimum_alpha) -    { -        discard; -    } - -    frag_data[0] = vec4(col.rgb, 0.0); -    frag_data[1] = vec4(0,0,0,0); // spec -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +	vec4 col = texture(diffuseMap, vary_texcoord0.xy); +	 +	if (col.a < minimum_alpha) +	{ +		discard; +	} + +	frag_data[0] = vec4(col.rgb, 0.0); +	frag_data[1] = vec4(0,0,0,0); // spec +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl index d3d375b20a..799fc62a42 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl @@ -1,30 +1,30 @@ -/** +/**    * @file diffuseF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */  /*[EXTRA_CODE_HERE]*/ - +   out vec4 frag_data[4];  uniform sampler2D diffuseMap; @@ -32,17 +32,19 @@ uniform sampler2D diffuseMap;  in vec3 vary_normal;  in vec4 vertex_color;  in vec2 vary_texcoord0; +in vec3 vary_position; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 pos); -void main() +void main()   { -    vec3 col = vertex_color.rgb * texture(diffuseMap, vary_texcoord0.xy).rgb; -    frag_data[0] = vec4(col, 0.0); -    frag_data[1] = vertex_color.aaaa; // spec -    //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS); -    frag_data[3] = vec4(0); +    mirrorClip(vary_position); +	vec3 col = vertex_color.rgb * texture(diffuseMap, vary_texcoord0.xy).rgb; +	frag_data[0] = vec4(col, 0.0); +	frag_data[1] = vertex_color.aaaa; // spec +	//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS); +    frag_data[3] = vec4(vertex_color.a, 0, 0, 0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl index afdd043c7c..3362a180c6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file diffuseIndexedF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -30,20 +30,22 @@ out vec4 frag_data[4];  in vec3 vary_normal;  in vec4 vertex_color;  in vec2 vary_texcoord0; +in vec3 vary_position; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 pos);  vec3 linear_to_srgb(vec3 c); -void main() +void main()   { -    vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb; +    mirrorClip(vary_position); +	vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb; -    vec3 spec; -    spec.rgb = vec3(vertex_color.a); +	vec3 spec; +	spec.rgb = vec3(vertex_color.a); -    frag_data[0] = vec4(col, 0.0); -    frag_data[1] = vec4(spec, vertex_color.a); // spec -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), vertex_color.a, GBUFFER_FLAG_HAS_ATMOS); -    frag_data[3] = vec4(0); +	frag_data[0] = vec4(col, 0.0); +	frag_data[1] = vec4(spec, vertex_color.a); // spec +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS); +    frag_data[3] = vec4(vertex_color.a, 0, 0, 0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index 304c01ecc3..64230dc680 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file diffuseV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -36,13 +36,16 @@ out vec3 vary_normal;  out vec4 vertex_color;  out vec2 vary_texcoord0; +out vec3 vary_position;  void passTextureIndex(); +uniform mat4 modelview_matrix; +  #ifdef HAS_SKIN  mat4 getObjectSkinnedTransform();  uniform mat4 projection_matrix; -uniform mat4 modelview_matrix; +  #endif  void main() @@ -51,16 +54,18 @@ void main()      mat4 mat = getObjectSkinnedTransform();      mat = modelview_matrix * mat;      vec4 pos = mat * vec4(position.xyz, 1.0); +    vary_position = pos.xyz;      gl_Position = projection_matrix * pos;      vary_normal = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz);  #else -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +    vary_position = (modelview_matrix * vec4(position.xyz, 1.0)).xyz; +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);       vary_normal = normalize(normal_matrix * normal);  #endif +	 +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	 +	passTextureIndex(); -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - -    passTextureIndex(); - -    vertex_color = diffuse_color; +	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl index 709b47dcbd..eff7221ae7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl @@ -1,34 +1,36 @@ -/** +/**    * @file exposureF.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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_color;  uniform sampler2D emissiveRect; +#ifdef USE_LAST_EXPOSURE  uniform sampler2D exposureMap; +#endif  uniform float dt;  uniform vec2 noiseVec; @@ -41,7 +43,7 @@ float lum(vec3 col)      return dot(l, col);  } -void main() +void main()   {      vec2 tc = vec2(0.5,0.5); @@ -51,11 +53,13 @@ void main()      L /= max_L;      L = pow(L, 2.0);      float s = mix(dynamic_exposure_params.z, dynamic_exposure_params.y, L); - +     +#ifdef USE_LAST_EXPOSURE      float prev = texture(exposureMap, vec2(0.5,0.5)).r;      s = mix(prev, s, min(dt*2.0*abs(prev-s), 0.04)); - +#endif +          frag_color = max(vec4(s, s, s, dt), vec4(0.0));  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index ec6a4a502f..52dfed06ae 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file deferred/fullbrightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_color; @@ -50,9 +50,11 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou  vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);  #endif -void main() -{ +void mirrorClip(vec3 pos); +void main()  +{ +    mirrorClip(vary_position);  #ifdef IS_ALPHA      waterClip(vary_position.xyz);  #endif @@ -88,7 +90,7 @@ void main()      calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten);      color.rgb = applySkyAndWaterFog(pos, additive, atten, color).rgb; - +      #endif  #endif diff --git a/indra/newview/app_settings/shaders/class1/deferred/globalF.glsl b/indra/newview/app_settings/shaders/class1/deferred/globalF.glsl new file mode 100644 index 0000000000..7e3e7d9271 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/globalF.glsl @@ -0,0 +1,45 @@ +/**  + * @file class1/deferred/globalF.glsl + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + + + // Global helper functions included in every fragment shader + // DO NOT declare sampler uniforms here as OS X doesn't compile + // them out + +uniform float mirror_flag; +uniform vec4 clipPlane; +uniform float clipSign; + +void mirrorClip(vec3 pos) +{ +    if (mirror_flag > 0) +    { +        if ((dot(pos.xyz, clipPlane.xyz) + clipPlane.w) < 0.0) +        { +                discard; +        } +    } +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index 5561a3d488..c64f65e32c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file impostorF.glsl   *   * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -37,22 +37,21 @@ uniform sampler2D specularMap;  in vec2 vary_texcoord0;  vec3 linear_to_srgb(vec3 c); -vec2 encode_normal (vec3 n); -void main() +void main()   { -    vec4 col = texture(diffuseMap, vary_texcoord0.xy); +	vec4 col = texture(diffuseMap, vary_texcoord0.xy); -    if (col.a < minimum_alpha) -    { -        discard; -    } +	if (col.a < minimum_alpha) +	{ +		discard; +	} -    vec4 norm = texture(normalMap,   vary_texcoord0.xy); -    vec4 spec = texture(specularMap, vary_texcoord0.xy); +	vec4 norm = texture(normalMap,   vary_texcoord0.xy); +	vec4 spec = texture(specularMap, vary_texcoord0.xy); -    frag_data[0] = vec4(col.rgb, 0.0); -    frag_data[1] = spec; -    frag_data[2] = vec4(encode_normal(norm.xyz),0,GBUFFER_FLAG_HAS_ATMOS); +	frag_data[0] = vec4(col.rgb, 0.0); +	frag_data[1] = spec; +	frag_data[2] = vec4(norm.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index b9337a357f..95b2f80e06 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -1,32 +1,32 @@ -/** +/**    * @file luminanceF.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$   */ - +   /*[EXTRA_CODE_HERE]*/ -// take a luminance sample of diffuseRect and emissiveRect +// take a luminance sample of diffuseRect and emissiveRect   out vec4 frag_color; @@ -34,6 +34,8 @@ in vec2 vary_fragcoord;  uniform sampler2D diffuseRect;  uniform sampler2D emissiveRect; +uniform sampler2D normalMap; +uniform float diffuse_luminance_scale;  float lum(vec3 col)  { @@ -41,11 +43,25 @@ float lum(vec3 col)      return dot(l, col);  } -void main() +void main()   {      vec2 tc = vary_fragcoord*0.6+0.2;      tc.y -= 0.1; // HACK - nudge exposure sample down a little bit to favor ground over sky -    vec3 c = texture(diffuseRect, tc).rgb + texture(emissiveRect, tc).rgb; +    vec3 c = texture(diffuseRect, tc).rgb; +     +    vec4  norm         = texture(normalMap, tc); + +    if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_HDRI) && +        !GET_GBUFFER_FLAG(GBUFFER_FLAG_SKIP_ATMOS)) +    { +        // Apply the diffuse luminance scale to objects but not the sky +        // Prevents underexposing when looking at bright environments +        // while still allowing for realistically bright skies. +        c *= diffuse_luminance_scale; +    } + +    c += texture(emissiveRect, tc).rgb; +      float L = lum(c);      frag_color = vec4(max(L, 0.0));  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl index 5e48ff709f..ddf878ae60 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file materialV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -28,25 +28,18 @@  #define DIFFUSE_ALPHA_MODE_MASK 2  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3 -#ifdef HAS_SKIN  uniform mat4 modelview_matrix;  uniform mat4 projection_matrix; +uniform mat4 modelview_projection_matrix; + +#ifdef HAS_SKIN  mat4 getObjectSkinnedTransform();  #else  uniform mat3 normal_matrix; -uniform mat4 modelview_projection_matrix; -#endif - -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) - -#if !defined(HAS_SKIN) -uniform mat4 modelview_matrix;  #endif  out vec3 vary_position; -#endif -  uniform mat4 texture_matrix0;  in vec3 position; @@ -72,71 +65,67 @@ out vec3 vary_normal;  in vec2 texcoord2;  out vec2 vary_texcoord2;  #endif - +   out vec4 vertex_color;  out vec2 vary_texcoord0;  void main()  {  #ifdef HAS_SKIN -    mat4 mat = getObjectSkinnedTransform(); +	mat4 mat = getObjectSkinnedTransform(); -    mat = modelview_matrix * mat; +	mat = modelview_matrix * mat; -    vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; +	vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) -    vary_position = pos; -#endif +	vary_position = pos; -    gl_Position = projection_matrix*vec4(pos,1.0); +	gl_Position = projection_matrix*vec4(pos,1.0);  #else -    //transform vertex -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +	//transform vertex +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif - -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - +	 +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	  #ifdef HAS_NORMAL_MAP -    vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy; +	vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy;  #endif  #ifdef HAS_SPECULAR_MAP -    vary_texcoord2 = (texture_matrix0 * vec4(texcoord2,0,1)).xy; +	vary_texcoord2 = (texture_matrix0 * vec4(texcoord2,0,1)).xy;  #endif  #ifdef HAS_SKIN -    vec3 n = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz); +	vec3 n = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz);  #ifdef HAS_NORMAL_MAP -    vec3 t = normalize((mat*vec4(tangent.xyz+position.xyz,1.0)).xyz-pos.xyz); +	vec3 t = normalize((mat*vec4(tangent.xyz+position.xyz,1.0)).xyz-pos.xyz);      vary_tangent = t;      vary_sign = tangent.w;      vary_normal = n;  #else //HAS_NORMAL_MAP -    vary_normal  = n; +	vary_normal  = n;  #endif //HAS_NORMAL_MAP  #else //HAS_SKIN -    vec3 n = normalize(normal_matrix * normal); +	vec3 n = normalize(normal_matrix * normal);  #ifdef HAS_NORMAL_MAP -    vec3 t = normalize(normal_matrix * tangent.xyz); +	vec3 t = normalize(normal_matrix * tangent.xyz);      vary_tangent = t;      vary_sign = tangent.w;      vary_normal = n;  #else //HAS_NORMAL_MAP -    vary_normal = n; +	vary_normal = n;  #endif //HAS_NORMAL_MAP  #endif //HAS_SKIN +	 +	vertex_color = diffuse_color; -    vertex_color = diffuse_color; - -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  #if !defined(HAS_SKIN) -    vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; -#endif +	vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz;  #endif  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl index 03a8518c36..6ef556d7e8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file class1\deferred\moonF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2005, 2020 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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_data[4]; @@ -34,7 +34,7 @@ uniform sampler2D diffuseMap;  in vec2 vary_texcoord0; -void main() +void main()   {      // Restore Pre-EEP alpha fade moon near horizon      float fade = 1.0; @@ -55,7 +55,7 @@ void main()      frag_data[0] = vec4(0);      frag_data[1] = vec4(0.0); -    frag_data[2] = vec4(0.0, 0.0, 0.0, GBUFFER_FLAG_HAS_ATMOS); +    frag_data[2] = vec4(0.0, 0.0, 0.0, GBUFFER_FLAG_SKIP_ATMOS);      frag_data[3] = vec4(c.rgb, c.a);      // Added and commented out for a ground truth.  Do not uncomment - Geenz diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl index ed19fba228..1d5f810cf3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file pbropaqueF.glsl   *   * $LicenseInfo:firstyear=2022&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2022, 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$   */ @@ -28,7 +28,7 @@  #ifndef IS_HUD -// deferred opaque implementation +// deferred opaque implementation   uniform sampler2D diffuseMap;  //always in sRGB space @@ -54,14 +54,20 @@ in vec2 emissive_texcoord;  uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() -vec2 encode_normal(vec3 n);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); +uniform vec4 clipPlane; +uniform float clipSign; + +void mirrorClip(vec3 pos); +  uniform mat3 normal_matrix;  void main()  { +    mirrorClip(vary_position); +      vec4 basecolor = texture(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      { @@ -75,7 +81,7 @@ void main()      float sign = vary_sign;      vec3 vN = vary_normal;      vec3 vT = vary_tangent.xyz; - +          vec3 vB = sign * cross(vN, vT);      vec3 tnorm = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN ); @@ -85,7 +91,7 @@ void main()      //   roughness 0.0      //   metal     0.0      vec3 spec = texture(specularMap, metallic_roughness_texcoord.xy).rgb; - +          spec.g *= roughnessFactor;      spec.b *= metallicFactor; @@ -103,7 +109,7 @@ void main()      // See: C++: addDeferredAttachments(), GLSL: softenLightF      frag_data[0] = max(vec4(col, 0.0), vec4(0));                                                   // Diffuse      frag_data[1] = max(vec4(spec.rgb,vertex_color.a), vec4(0));                                    // PBR linear packed Occlusion, Roughness, Metal. -    frag_data[2] = max(vec4(encode_normal(tnorm), vertex_color.a, GBUFFER_FLAG_HAS_PBR), vec4(0)); // normal, environment intensity, flags +    frag_data[2] = vec4(tnorm, GBUFFER_FLAG_HAS_PBR); // normal, environment intensity, flags      frag_data[3] = max(vec4(emissive,0), vec4(0));                                                // PBR sRGB Emissive  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl index 53e4b732df..5e0141910b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file pbropaqueV.glsl   *   * $LicenseInfo:firstyear=2022&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2022, 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$   */ @@ -28,8 +28,9 @@  //deferred opaque implementation -#ifdef HAS_SKIN  uniform mat4 modelview_matrix; + +#ifdef HAS_SKIN  uniform mat4 projection_matrix;  mat4 getObjectSkinnedTransform();  #else @@ -53,12 +54,13 @@ out vec2 base_color_texcoord;  out vec2 normal_texcoord;  out vec2 metallic_roughness_texcoord;  out vec2 emissive_texcoord; - +   out vec4 vertex_color;  out vec3 vary_tangent;  flat out float vary_sign;  out vec3 vary_normal; +out vec3 vary_position;  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); @@ -66,17 +68,18 @@ vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] kh  void main()  {  #ifdef HAS_SKIN -    mat4 mat = getObjectSkinnedTransform(); - -    mat = modelview_matrix * mat; +	mat4 mat = getObjectSkinnedTransform(); -    vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; +	mat = modelview_matrix * mat; -    gl_Position = projection_matrix*vec4(pos,1.0); +	vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; +    vary_position = pos; +	gl_Position = projection_matrix*vec4(pos,1.0);  #else -    //transform vertex -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +    vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; +	//transform vertex +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif      base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); @@ -85,11 +88,11 @@ void main()      emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  #ifdef HAS_SKIN -    vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; -    vec3 t = (mat*vec4(tangent.xyz+position.xyz,1.0)).xyz-pos.xyz; +	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; +	vec3 t = (mat*vec4(tangent.xyz+position.xyz,1.0)).xyz-pos.xyz;  #else //HAS_SKIN -    vec3 n = normal_matrix * normal; -    vec3 t = normal_matrix * tangent.xyz; +	vec3 n = normal_matrix * normal; +	vec3 t = normal_matrix * tangent.xyz;  #endif      n = normalize(n); @@ -97,11 +100,11 @@ void main()      vary_tangent = normalize(tangent_space_transform(vec4(t, tangent.w), n, texture_normal_transform, texture_matrix0));      vary_sign = tangent.w;      vary_normal = n; - -    vertex_color = diffuse_color; +	 +	vertex_color = diffuse_color;  } -#else +#else   // fullbright HUD implementation @@ -118,7 +121,7 @@ in vec2 texcoord0;  out vec2 base_color_texcoord;  out vec2 emissive_texcoord; - +   out vec4 vertex_color;  vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); @@ -126,7 +129,7 @@ vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl  void main()  {      //transform vertex -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);       base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0);      emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl new file mode 100644 index 0000000000..de4745c1c4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl @@ -0,0 +1,347 @@ +/**  + * @file class1\deferred\terrainF.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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#define TERRAIN_PBR_DETAIL_EMISSIVE 0 +#define TERRAIN_PBR_DETAIL_OCCLUSION -1 +#define TERRAIN_PBR_DETAIL_NORMAL -2 +#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3 + +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +#define TerrainCoord vec4[2] +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +#define TerrainCoord vec2 +#endif + +#define MIX_X    1 << 3 +#define MIX_Y    1 << 4 +#define MIX_Z    1 << 5 +#define MIX_W    1 << 6 + +struct TerrainMix +{ +    vec4 weight; +    int type; +}; + +TerrainMix get_terrain_mix_weights(float alpha1, float alpha2, float alphaFinal); + +struct PBRMix +{ +    vec4 col;       // RGB color with alpha, linear space +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    vec3 orm;       // Occlusion, roughness, metallic +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    vec2 rm;        // Roughness, metallic +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    vec3 vNt;       // Unpacked normal texture sample, vector +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    vec3 emissive;  // RGB emissive color, linear space +#endif +}; + +PBRMix init_pbr_mix(); + +PBRMix terrain_sample_and_multiply_pbr( +    TerrainCoord terrain_coord +    , sampler2D tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , sampler2D tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    , sampler2D tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , sampler2D tex_emissive +#endif +    , vec4 factor_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    , vec3 factor_orm +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , vec2 factor_rm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , vec3 factor_emissive +#endif +    ); + +PBRMix mix_pbr(PBRMix mix1, PBRMix mix2, float mix2_weight); + +out vec4 frag_data[4]; + +uniform sampler2D alpha_ramp; + +// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures +uniform sampler2D detail_0_base_color; +uniform sampler2D detail_1_base_color; +uniform sampler2D detail_2_base_color; +uniform sampler2D detail_3_base_color; +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +uniform sampler2D detail_0_normal; +uniform sampler2D detail_1_normal; +uniform sampler2D detail_2_normal; +uniform sampler2D detail_3_normal; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +uniform sampler2D detail_0_metallic_roughness; +uniform sampler2D detail_1_metallic_roughness; +uniform sampler2D detail_2_metallic_roughness; +uniform sampler2D detail_3_metallic_roughness; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +uniform sampler2D detail_0_emissive; +uniform sampler2D detail_1_emissive; +uniform sampler2D detail_2_emissive; +uniform sampler2D detail_3_emissive; +#endif + +uniform vec4[4] baseColorFactors; // See also vertex_color in pbropaqueV.glsl +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +uniform vec4 metallicFactors; +uniform vec4 roughnessFactors; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +uniform vec3[4] emissiveColors; +#endif +uniform vec4 minimum_alphas; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() + +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +in vec4[2] vary_coords; +#endif +in vec3 vary_position; +in vec3 vary_normal; +in vec3 vary_tangent; +flat in float vary_sign; +in vec4 vary_texcoord0; +in vec4 vary_texcoord1; + +void mirrorClip(vec3 position); + +float terrain_mix(TerrainMix tm, vec4 tms4); + +void main() +{ +    // Make sure we clip the terrain if we're in a mirror. +    mirrorClip(vary_position); + +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +    TerrainCoord terrain_texcoord = vary_coords; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +    TerrainCoord terrain_texcoord = vary_texcoord0.xy; +#endif + +    float alpha1 = texture(alpha_ramp, vary_texcoord0.zw).a; +    float alpha2 = texture(alpha_ramp,vary_texcoord1.xy).a; +    float alphaFinal = texture(alpha_ramp, vary_texcoord1.zw).a; + +    TerrainMix tm = get_terrain_mix_weights(alpha1, alpha2, alphaFinal); + +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    // RGB = Occlusion, Roughness, Metal +    // default values, see LLViewerTexture::sDefaultPBRORMImagep +    //   occlusion 1.0 +    //   roughness 0.0 +    //   metal     0.0 +    vec3[4] orm_factors; +    orm_factors[0] = vec3(1.0, roughnessFactors.x, metallicFactors.x); +    orm_factors[1] = vec3(1.0, roughnessFactors.y, metallicFactors.y); +    orm_factors[2] = vec3(1.0, roughnessFactors.z, metallicFactors.z); +    orm_factors[3] = vec3(1.0, roughnessFactors.w, metallicFactors.w); +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    vec2[4] rm_factors; +    rm_factors[0] = vec2(roughnessFactors.x, metallicFactors.x); +    rm_factors[1] = vec2(roughnessFactors.y, metallicFactors.y); +    rm_factors[2] = vec2(roughnessFactors.z, metallicFactors.z); +    rm_factors[3] = vec2(roughnessFactors.w, metallicFactors.w); +#endif + +    PBRMix mix = init_pbr_mix(); +    PBRMix mix2; +    switch (tm.type & MIX_X) +    { +    case MIX_X: +        mix2 = terrain_sample_and_multiply_pbr( +            terrain_texcoord +            , detail_0_base_color +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , detail_0_metallic_roughness +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , detail_0_normal +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , detail_0_emissive +#endif +            , baseColorFactors[0] +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +            , orm_factors[0] +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , rm_factors[0] +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , emissiveColors[0] +#endif +        ); +        mix = mix_pbr(mix, mix2, tm.weight.x); +        break; +    default: +        break; +    } +    switch (tm.type & MIX_Y) +    { +    case MIX_Y: +        mix2 = terrain_sample_and_multiply_pbr( +            terrain_texcoord +            , detail_1_base_color +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , detail_1_metallic_roughness +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , detail_1_normal +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , detail_1_emissive +#endif +            , baseColorFactors[1] +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +            , orm_factors[1] +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , rm_factors[1] +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , emissiveColors[1] +#endif +        ); +        mix = mix_pbr(mix, mix2, tm.weight.y); +        break; +    default: +        break; +    } +    switch (tm.type & MIX_Z) +    { +    case MIX_Z: +        mix2 = terrain_sample_and_multiply_pbr( +            terrain_texcoord +            , detail_2_base_color +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , detail_2_metallic_roughness +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , detail_2_normal +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , detail_2_emissive +#endif +            , baseColorFactors[2] +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +            , orm_factors[2] +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , rm_factors[2] +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , emissiveColors[2] +#endif +        ); +        mix = mix_pbr(mix, mix2, tm.weight.z); +        break; +    default: +        break; +    } +    switch (tm.type & MIX_W) +    { +    case MIX_W: +        mix2 = terrain_sample_and_multiply_pbr( +            terrain_texcoord +            , detail_3_base_color +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , detail_3_metallic_roughness +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , detail_3_normal +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , detail_3_emissive +#endif +            , baseColorFactors[3] +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +            , orm_factors[3] +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , rm_factors[3] +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , emissiveColors[3] +#endif +        ); +        mix = mix_pbr(mix, mix2, tm.weight.w); +        break; +    default: +        break; +    } + +    float minimum_alpha = terrain_mix(tm, minimum_alphas); +    if (mix.col.a < minimum_alpha) +    { +        discard; +    } +    float base_color_factor_alpha = terrain_mix(tm, vec4(baseColorFactors[0].z, baseColorFactors[1].z, baseColorFactors[2].z, baseColorFactors[3].z)); + +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    // from mikktspace.com +    vec3 vNt = mix.vNt; +    vec3 vN = vary_normal; +    vec3 vT = vary_tangent.xyz; +     +    vec3 vB = vary_sign * cross(vN, vT); +    vec3 tnorm = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN ); + +    tnorm *= gl_FrontFacing ? 1.0 : -1.0; +#else +    vec3 tnorm = vary_normal; +    tnorm *= gl_FrontFacing ? 1.0 : -1.0; +#endif +    + +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +#define emissive mix.emissive +#else +#define emissive vec3(0) +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +#define orm mix.orm +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +#define orm vec3(1.0, mix.rm) +#else +// Matte plastic potato terrain +#define orm vec3(1.0, 1.0, 0.0) +#endif +    frag_data[0] = max(vec4(mix.col.xyz, 0.0), vec4(0));                                                   // Diffuse +    frag_data[1] = max(vec4(orm.rgb, base_color_factor_alpha), vec4(0));                                    // PBR linear packed Occlusion, Roughness, Metal. +    frag_data[2] = vec4(tnorm, GBUFFER_FLAG_HAS_PBR); // normal, flags +    frag_data[3] = max(vec4(emissive,0), vec4(0));                                                // PBR sRGB Emissive +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl new file mode 100644 index 0000000000..935c3f9301 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl @@ -0,0 +1,473 @@ +/**  + * @file class1\deferred\pbrterrainUtilF.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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +/** + * Triplanar mapping implementation adapted from Inigo Quilez' example shader, + * MIT license. + * https://www.shadertoy.com/view/MtsGWH + * Copyright © 2015 Inigo Quilez + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: The above copyright + * notice and this permission notice shall be included in all copies or + * substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", + * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#define TERRAIN_PBR_DETAIL_EMISSIVE 0 +#define TERRAIN_PBR_DETAIL_OCCLUSION -1 +#define TERRAIN_PBR_DETAIL_NORMAL -2 +#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3 + +in vec3 vary_vertex_normal; + +vec3 srgb_to_linear(vec3 c); + +// A relatively agressive threshold for terrain material mixing sampling +// cutoff. This ensures that only one or two materials are used in most places, +// making PBR terrain blending more performant. Should be greater than 0 to work. +#define TERRAIN_RAMP_MIX_THRESHOLD 0.1 +// A small threshold for triplanar mapping sampling cutoff. This and +// TERRAIN_TRIPLANAR_BLEND_FACTOR together ensures that only one or two samples +// per texture are used in most places, making triplanar mapping more +// performant. Should be greater than 0 to work. +// There's also an artistic design choice in the use of these factors, and the +// use of triplanar generally. Don't take these triplanar constants for granted. +#define TERRAIN_TRIPLANAR_MIX_THRESHOLD 0.01 + +#define SAMPLE_X 1 << 0 +#define SAMPLE_Y 1 << 1 +#define SAMPLE_Z 1 << 2 +#define MIX_X    1 << 3 +#define MIX_Y    1 << 4 +#define MIX_Z    1 << 5 +#define MIX_W    1 << 6 + +struct PBRMix +{ +    vec4 col;       // RGB color with alpha, linear space +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    vec3 orm;       // Occlusion, roughness, metallic +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    vec2 rm;        // Roughness, metallic +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    vec3 vNt;       // Unpacked normal texture sample, vector +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    vec3 emissive;  // RGB emissive color, linear space +#endif +}; + +PBRMix init_pbr_mix() +{ +    PBRMix mix; +    mix.col = vec4(0); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    mix.orm = vec3(0); +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    mix.rm = vec2(0); +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    mix.vNt = vec3(0); +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    mix.emissive = vec3(0); +#endif +    return mix; +} + +// Usage example, for two weights: +// vec2 weights = ... // Weights must add up to 1 +// PBRMix mix = init_pbr_mix(); +// PBRMix mix1 = ... +// mix = mix_pbr(mix, mix1, weights.x); +// PBRMix mix2 = ... +// mix = mix_pbr(mix, mix2, weights.y); +PBRMix mix_pbr(PBRMix mix1, PBRMix mix2, float mix2_weight) +{ +    PBRMix mix; +    mix.col      = mix1.col      + (mix2.col      * mix2_weight); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    mix.orm      = mix1.orm      + (mix2.orm      * mix2_weight); +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    mix.rm       = mix1.rm       + (mix2.rm       * mix2_weight); +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    mix.vNt      = mix1.vNt      + (mix2.vNt      * mix2_weight); +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    mix.emissive = mix1.emissive + (mix2.emissive * mix2_weight); +#endif +    return mix; +} + +PBRMix sample_pbr( +    vec2 uv +    , sampler2D tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , sampler2D tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    , sampler2D tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , sampler2D tex_emissive +#endif +    ) +{ +    PBRMix mix; +    mix.col = texture(tex_col, uv); +    mix.col.rgb = srgb_to_linear(mix.col.rgb); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    mix.orm = texture(tex_orm, uv).xyz; +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    mix.rm = texture(tex_orm, uv).yz; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    mix.vNt = texture(tex_vNt, uv).xyz*2.0-1.0; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    mix.emissive = srgb_to_linear(texture(tex_emissive, uv).xyz); +#endif +    return mix; +} + +struct TerrainTriplanar +{ +    vec3 weight; +    int type; +}; + +struct TerrainMix +{ +    vec4 weight; +    int type; +}; + +#define TerrainMixSample vec4[4] +#define TerrainMixSample3 vec3[4] + +TerrainMix get_terrain_mix_weights(float alpha1, float alpha2, float alphaFinal) +{ +    TerrainMix tm; +    vec4 sample_x = vec4(1,0,0,0); +    vec4 sample_y = vec4(0,1,0,0); +    vec4 sample_z = vec4(0,0,1,0); +    vec4 sample_w = vec4(0,0,0,1); + +    tm.weight = mix( mix(sample_w, sample_z, alpha2), mix(sample_y, sample_x, alpha1), alphaFinal ); +    tm.weight -= TERRAIN_RAMP_MIX_THRESHOLD; +    ivec4 usage = max(ivec4(0), ivec4(ceil(tm.weight))); +    // Prevent negative weights and keep weights balanced +    tm.weight = tm.weight*vec4(usage); +    tm.weight /= (tm.weight.x + tm.weight.y + tm.weight.z + tm.weight.w); + +    tm.type = (usage.x * MIX_X) | +              (usage.y * MIX_Y) | +              (usage.z * MIX_Z) | +              (usage.w * MIX_W); +    return tm; +} + +TerrainTriplanar _t_triplanar() +{ +    float sharpness = TERRAIN_TRIPLANAR_BLEND_FACTOR; +    float threshold = TERRAIN_TRIPLANAR_MIX_THRESHOLD; +    vec3 weight_signed = pow(abs(vary_vertex_normal), vec3(sharpness)); +    weight_signed /= (weight_signed.x + weight_signed.y + weight_signed.z); +    weight_signed -= vec3(threshold); +    TerrainTriplanar tw; +    // *NOTE: Make sure the threshold doesn't affect the materials +    tw.weight = max(vec3(0), weight_signed); +    tw.weight /= (tw.weight.x + tw.weight.y + tw.weight.z); +    ivec3 usage = ivec3(round(max(vec3(0), sign(weight_signed)))); +    tw.type = ((usage.x) * SAMPLE_X) | +              ((usage.y) * SAMPLE_Y) | +              ((usage.z) * SAMPLE_Z); +    return tw; +} + +// Assume weights add to 1 +float terrain_mix(TerrainMix tm, vec4 tms4) +{ +    return (tm.weight.x * tms4[0]) + +           (tm.weight.y * tms4[1]) + +           (tm.weight.z * tms4[2]) + +           (tm.weight.w * tms4[3]); +} + +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +// Triplanar mapping + +// Pre-transformed texture coordinates for each axial uv slice (Packing: xy, yz, (-x)z, unused) +#define TerrainCoord vec4[2] + +vec2 _t_uv(vec2 uv_unflipped, float sign_or_zero) +{ +    // Handle case where sign is 0 +    float sign = (2.0*sign_or_zero) + 1.0; +    sign /= abs(sign); +    // If the vertex normal is negative, flip the texture back +    // right-side up. +    vec2 uv = uv_unflipped * vec2(sign, 1); +    return uv; +} + +vec3 _t_normal_post_1(vec3 vNt0, float sign_or_zero) +{ +    // Assume normal is unpacked +    vec3 vNt1 = vNt0; +    // Get sign +    float sign = sign_or_zero; +    // Handle case where sign is 0 +    sign = (2.0*sign) + 1.0; +    sign /= abs(sign); +    // If the sign is negative, rotate normal by 180 degrees +    vNt1.xy = (min(0, sign) * vNt1.xy) + (min(0, -sign) * -vNt1.xy); +    return vNt1; +} + +// Triplanar-specific normal texture fixes +vec3 _t_normal_post_x(vec3 vNt0) +{ +    vec3 vNt_x = _t_normal_post_1(vNt0, sign(vary_vertex_normal.x)); +    // *HACK: Transform normals according to orientation of the UVs +    vNt_x.xy = vec2(-vNt_x.y, vNt_x.x); +    return vNt_x; +} +vec3 _t_normal_post_y(vec3 vNt0) +{ +    vec3 vNt_y = _t_normal_post_1(vNt0, sign(vary_vertex_normal.y)); +    // *HACK: Transform normals according to orientation of the UVs +    vNt_y.xy = -vNt_y.xy; +    return vNt_y; +} +vec3 _t_normal_post_z(vec3 vNt0) +{ +    vec3 vNt_z = _t_normal_post_1(vNt0, sign(vary_vertex_normal.z)); +    return vNt_z; +} + +PBRMix terrain_sample_pbr( +    TerrainCoord terrain_coord +    , TerrainTriplanar tw +    , sampler2D tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , sampler2D tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    , sampler2D tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , sampler2D tex_emissive +#endif +    ) +{ +    PBRMix mix = init_pbr_mix(); + +#define get_uv_x() _t_uv(terrain_coord[0].zw, sign(vary_vertex_normal.x)) +#define get_uv_y() _t_uv(terrain_coord[1].xy, sign(vary_vertex_normal.y)) +#define get_uv_z() _t_uv(terrain_coord[0].xy, sign(vary_vertex_normal.z)) +    switch (tw.type & SAMPLE_X) +    { +    case SAMPLE_X: +        PBRMix mix_x = sample_pbr( +            get_uv_x() +            , tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , tex_emissive +#endif +            ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        // Triplanar-specific normal texture fix +        mix_x.vNt = _t_normal_post_x(mix_x.vNt); +#endif +        mix = mix_pbr(mix, mix_x, tw.weight.x); +        break; +    default: +        break; +    } + +    switch (tw.type & SAMPLE_Y) +    { +    case SAMPLE_Y: +        PBRMix mix_y = sample_pbr( +            get_uv_y() +            , tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , tex_emissive +#endif +            ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        // Triplanar-specific normal texture fix +        mix_y.vNt = _t_normal_post_y(mix_y.vNt); +#endif +        mix = mix_pbr(mix, mix_y, tw.weight.y); +        break; +    default: +        break; +    } + +    switch (tw.type & SAMPLE_Z) +    { +    case SAMPLE_Z: +        PBRMix mix_z = sample_pbr( +            get_uv_z() +            , tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +            , tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +            , tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +            , tex_emissive +#endif +            ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        // Triplanar-specific normal texture fix +        // *NOTE: Bottom face has not been tested +        mix_z.vNt = _t_normal_post_z(mix_z.vNt); +#endif +        mix = mix_pbr(mix, mix_z, tw.weight.z); +        break; +    default: +        break; +    } +     +    return mix; +} + +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 + +#define TerrainCoord vec2 + +#define terrain_sample_pbr sample_pbr + +#endif + +PBRMix multiply_factors_pbr( +    PBRMix mix_in +    , vec4 factor_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    , vec3 factor_orm +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , vec2 factor_rm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , vec3 factor_emissive +#endif +    ) +{ +    PBRMix mix = mix_in; +    mix.col *= factor_col; +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    mix.orm *= factor_orm; +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    mix.rm *= factor_rm; +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    mix.emissive *= factor_emissive; +#endif +    return mix; +} + +PBRMix terrain_sample_and_multiply_pbr( +    TerrainCoord terrain_coord +    , sampler2D tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , sampler2D tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    , sampler2D tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , sampler2D tex_emissive +#endif +    , vec4 factor_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +    , vec3 factor_orm +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +    , vec2 factor_rm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +    , vec3 factor_emissive +#endif +    ) +{ +    PBRMix mix = terrain_sample_pbr( +        terrain_coord +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +        , _t_triplanar() +#endif +        , tex_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +        , tex_orm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        , tex_vNt +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +        , tex_emissive +#endif +        ); + +    mix = multiply_factors_pbr(mix +        , factor_col +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_OCCLUSION) +        , factor_orm +#elif (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS) +        , factor_rm +#endif +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) +        , factor_emissive +#endif +    ); + +    return mix; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl new file mode 100644 index 0000000000..489fc26e3f --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl @@ -0,0 +1,96 @@ +/**  + * @file class1\environment\pbrterrainV.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$ + */ + +uniform mat3 normal_matrix; +uniform mat4 texture_matrix0; +uniform mat4 modelview_matrix; +uniform mat4 modelview_projection_matrix; + +in vec3 position; +in vec3 normal; +in vec4 tangent; +in vec4 diffuse_color; +in vec2 texcoord1; + +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +out vec4[2] vary_coords; +#endif +out vec3 vary_vertex_normal; // Used by pbrterrainUtilF.glsl +out vec3 vary_normal; +out vec3 vary_tangent; +flat out float vary_sign; +out vec4 vary_texcoord0; +out vec4 vary_texcoord1; +out vec3 vary_position; + +// *HACK: tangent_space_transform should use texture_normal_transform, or maybe +// we shouldn't use tangent_space_transform at all. See the call to +// 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); + +void main() +{ +    //transform vertex +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  +    vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; + +	vec3 n = normal_matrix * normal; +    vary_vertex_normal = normal; +	vec3 t = normal_matrix * tangent.xyz; + +    vary_tangent = normalize(t); +    // *TODO: Decide if we want this. It may be better to just calculate the +    // tangents on-the-fly in the fragment shader, due to the subtleties of the +    // effect of triplanar mapping on UVs. +    // *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_sign = tangent.w; +    vary_normal = normalize(n); + +    // Transform and pass tex coords +    // *HACK: texture_base_color_transform is used for all of these here, but +    // the KHR texture transform spec requires handling texture transforms +    // 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); +    // yz +    vary_coords[0].zw = texture_transform(position.yz, texture_base_color_transform, texture_matrix0); +    // (-x)z +    vary_coords[1].xy = texture_transform(position.xz * vec2(-1, 1), texture_base_color_transform, texture_matrix0); +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +    vary_texcoord0.xy = texture_transform(position.xy, texture_base_color_transform, texture_matrix0); +#endif +     +    vec4 tc = vec4(texcoord1,0,1); +    vary_texcoord0.zw = tc.xy; +    vary_texcoord1.xy = tc.xy-vec2(2.0, 0.0); +    vary_texcoord1.zw = tc.xy-vec2(1.0, 0.0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index 7a25f63260..1629ed91c8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file postDeferredGammaCorrect.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_color; @@ -79,7 +79,7 @@ vec3 RRTAndODTFit(vec3 color)  } -// tone mapping +// tone mapping   vec3 toneMapACES_Hill(vec3 color)  {      color = ACESInputMat * color; @@ -97,16 +97,17 @@ vec3 toneMapACES_Hill(vec3 color)  uniform float exposure;  uniform float gamma; +uniform float aces_mix;  vec3 toneMap(vec3 color)  {  #ifndef NO_POST      float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; - +          color *= exposure * exp_scale;      // mix ACES and Linear here as a compromise to avoid over-darkening legacy content -    color = mix(toneMapACES_Hill(color), color, 0.3); +    color = mix(toneMapACES_Hill(color), color, aces_mix);  #endif      return color; @@ -116,42 +117,51 @@ vec3 toneMap(vec3 color)  //=================================  // borrowed noise from: -//  <https://www.shadertoy.com/view/4dS3Wd> -//  By Morgan McGuire @morgan3d, http://graphicscodex.com +//	<https://www.shadertoy.com/view/4dS3Wd> +//	By Morgan McGuire @morgan3d, http://graphicscodex.com  //  float hash(float n) { return fract(sin(n) * 1e4); }  float hash(vec2 p) { return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); }  float noise(float x) { -    float i = floor(x); -    float f = fract(x); -    float u = f * f * (3.0 - 2.0 * f); -    return mix(hash(i), hash(i + 1.0), u); +	float i = floor(x); +	float f = fract(x); +	float u = f * f * (3.0 - 2.0 * f); +	return mix(hash(i), hash(i + 1.0), u);  }  float noise(vec2 x) { -    vec2 i = floor(x); -    vec2 f = fract(x); - -    // Four corners in 2D of a tile -    float a = hash(i); -    float b = hash(i + vec2(1.0, 0.0)); -    float c = hash(i + vec2(0.0, 1.0)); -    float d = hash(i + vec2(1.0, 1.0)); - -    // Simple 2D lerp using smoothstep envelope between the values. -    // return vec3(mix(mix(a, b, smoothstep(0.0, 1.0, f.x)), -    //          mix(c, d, smoothstep(0.0, 1.0, f.x)), -    //          smoothstep(0.0, 1.0, f.y))); - -    // Same code, with the clamps in smoothstep and common subexpressions -    // optimized away. -    vec2 u = f * f * (3.0 - 2.0 * f); -    return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y; +	vec2 i = floor(x); +	vec2 f = fract(x); + +	// Four corners in 2D of a tile +	float a = hash(i); +	float b = hash(i + vec2(1.0, 0.0)); +	float c = hash(i + vec2(0.0, 1.0)); +	float d = hash(i + vec2(1.0, 1.0)); + +	// Simple 2D lerp using smoothstep envelope between the values. +	// return vec3(mix(mix(a, b, smoothstep(0.0, 1.0, f.x)), +	//			mix(c, d, smoothstep(0.0, 1.0, f.x)), +	//			smoothstep(0.0, 1.0, f.y))); + +	// Same code, with the clamps in smoothstep and common subexpressions +	// optimized away. +	vec2 u = f * f * (3.0 - 2.0 * f); +	return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;  }  //============================= +void debugExposure(inout vec3 color) +{ +    float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; +    exp_scale *= 0.5; +    if (abs(vary_fragcoord.y-exp_scale) < 0.01 && vary_fragcoord.x < 0.1) +    { +        color = vec3(1,0,0); +    } +}  vec3 legacyGamma(vec3 color)  { @@ -161,7 +171,7 @@ vec3 legacyGamma(vec3 color)      return c;  } -void main() +void main()   {      //this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)      vec4 diff = texture(diffuseRect, vary_fragcoord); @@ -181,6 +191,7 @@ void main()      vec3 nz = vec3(noise(seed.rg), noise(seed.gb), noise(seed.rb));      diff.rgb += nz*0.003; +    //debugExposure(diff.rgb);      frag_color = max(diff, vec4(0));  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index a07a4301bc..785c748234 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file class1/deferred/skyF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2005, 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$   */ @@ -27,6 +27,15 @@  in vec3 vary_HazeColor;  in float vary_LightNormPosDot; +#ifdef HAS_HDRI +in vec4 vary_position; +in vec3 vary_rel_pos; +uniform float sky_hdr_scale; +uniform float hdri_split_screen; +uniform mat3 env_mat; +uniform sampler2D environmentMap; +#endif +  uniform sampler2D rainbow_map;  uniform sampler2D halo_map; @@ -37,6 +46,9 @@ uniform float ice_level;  out vec4 frag_data[4];  vec3 srgb_to_linear(vec3 c); +vec3 linear_to_srgb(vec3 c); + +#define PI 3.14159265  /////////////////////////////////////////////////////////////////////////  // The fragment shader for the sky @@ -71,24 +83,42 @@ vec3 halo22(float d)  void main()  { -    // Potential Fill-rate optimization.  Add cloud calculation -    // back in and output alpha of 0 (so that alpha culling kills -    // the fragment) if the sky wouldn't show up because the clouds -    // are fully opaque. - -    vec3 color = vary_HazeColor; - -    float  rel_pos_lightnorm = vary_LightNormPosDot; -    float optic_d = rel_pos_lightnorm; -    vec3  halo_22 = halo22(optic_d); -    color.rgb += rainbow(optic_d); -    color.rgb += halo_22; -    color.rgb *= 2.; -    color.rgb = clamp(color.rgb, vec3(0), vec3(5)); +    vec3 color; +#ifdef HAS_HDRI +    vec3 frag_coord = vary_position.xyz/vary_position.w; +    if (-frag_coord.x > ((1.0-hdri_split_screen)*2.0-1.0)) +    { +        vec3 pos = normalize(vary_rel_pos); +        pos = env_mat * pos; +        vec2 texCoord = vec2(atan(pos.z, pos.x) + PI, acos(pos.y)) / vec2(2.0 * PI, PI); +        color = textureLod(environmentMap, texCoord.xy, 0).rgb * sky_hdr_scale; +        color = min(color, vec3(8192*8192*16)); // stupidly large value arrived at by binary search -- avoids framebuffer corruption from some HDRIs + +        frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_HAS_HDRI); +    } +    else +#endif +    { +        // Potential Fill-rate optimization.  Add cloud calculation  +        // back in and output alpha of 0 (so that alpha culling kills  +        // the fragment) if the sky wouldn't show up because the clouds  +        // are fully opaque. + +        color = vary_HazeColor; + +        float  rel_pos_lightnorm = vary_LightNormPosDot; +        float optic_d = rel_pos_lightnorm; +        vec3  halo_22 = halo22(optic_d); +        color.rgb += rainbow(optic_d); +        color.rgb += halo_22; +        color.rgb *= 2.; +        color.rgb = clamp(color.rgb, vec3(0), vec3(5)); + +        frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_SKIP_ATMOS); +    }      frag_data[0] = vec4(0);      frag_data[1] = vec4(0); -    frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_SKIP_ATMOS); //1.0 in norm.w masks off fog      frag_data[3] = vec4(color.rgb, 1.0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index 6110b6ade0..24d2db2183 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -35,6 +35,11 @@ in vec3 position;  out vec3 vary_HazeColor;  out float vary_LightNormPosDot; +#ifdef HAS_HDRI +out vec4 vary_position; +out vec3 vary_rel_pos; +#endif +  // Inputs  uniform vec3 camPosLocal; @@ -72,6 +77,11 @@ void main()      // Get relative position      vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); +#ifdef HAS_HDRI +    vary_rel_pos = rel_pos; +    vary_position = pos; +#endif +      // Adj position vector to clamp altitude      if (rel_pos.y > 0.)      { @@ -92,13 +102,13 @@ void main()      // Initialize temp variables      vec3 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color * 0.7; //magic 0.7 to match legacy color - +          // Sunlight attenuation effect (hue and brightness) due to atmosphere      // this is used later for sunlight modulation at various altitudes      vec3 light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y);      // Calculate relative weights -    vec3 combined_haze = abs(blue_density) + vec3(abs(haze_density)); +    vec3 combined_haze = max(abs(blue_density) + vec3(abs(haze_density)), vec3(1e-6));      vec3 blue_weight   = blue_density / combined_haze;      vec3 haze_weight   = haze_density / combined_haze; @@ -142,7 +152,7 @@ void main()      sunlight *= max(0.0, (1. - cloud_shadow));      // Haze color below cloud -    vec3 add_below_cloud = (blue_horizon * blue_weight * (sunlight + ambient) +    vec3 add_below_cloud = (blue_horizon * blue_weight * (sunlight + ambient)                            + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient));      // Attenuate cloud color by atmosphere diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl index bee9e6d2fe..5f598f84a7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file class1\deferred\terrainF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ - +   /*[EXTRA_CODE_HERE]*/  out vec4 frag_data[4]; @@ -38,12 +38,13 @@ in vec3 vary_normal;  in vec4 vary_texcoord0;  in vec4 vary_texcoord1; -vec2 encode_normal(vec3 n); +void mirrorClip(vec3 position);  void main()  { +    mirrorClip(pos);      /// Note: This should duplicate the blending functionality currently used for the terrain rendering. - +          vec4 color0 = texture(detail_0, vary_texcoord0.xy);      vec4 color1 = texture(detail_1, vary_texcoord0.xy);      vec4 color2 = texture(detail_2, vary_texcoord0.xy); @@ -53,13 +54,13 @@ void main()      float alpha2 = texture(alpha_ramp,vary_texcoord1.xy).a;      float alphaFinal = texture(alpha_ramp, vary_texcoord1.zw).a;      vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal ); - -    outColor.a = 0.0; // yes, downstream atmospherics - +    +    outColor.a = 0.0; // yes, downstream atmospherics  +          frag_data[0] = outColor;      frag_data[1] = vec4(0.0,0.0,0.0,-1.0);      vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +    frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl index aab2abff1e..8e1e4b54d5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl @@ -1,36 +1,36 @@ -/** +/**    * @file class1\environment\terrainV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0; +uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  in vec3 position;  in vec3 normal;  in vec4 diffuse_color; -in vec2 texcoord0;  in vec2 texcoord1;  out vec3 pos; @@ -41,18 +41,16 @@ out vec4 vary_texcoord1;  uniform vec4 object_plane_s;  uniform vec4 object_plane_t; -vec4 texgen_object(vec4  vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1) +vec2 texgen_object(vec4 vpos, mat4 mat, vec4 tp0, vec4 tp1)  {      vec4 tcoord; - +          tcoord.x = dot(vpos, tp0);      tcoord.y = dot(vpos, tp1); -    tcoord.z = tc.z; -    tcoord.w = tc.w; - -    tcoord = mat * tcoord; - -    return tcoord; +     +    tcoord = mat * tcoord;  +     +    return tcoord.xy;   }  void main() @@ -62,15 +60,15 @@ void main()      vec4 t_pos = modelview_projection_matrix * pre_pos;      gl_Position = t_pos; -    pos = t_pos.xyz; +    pos = (modelview_matrix*pre_pos).xyz;      vary_normal = normalize(normal_matrix * normal); - +          // Transform and pass tex coords -    vary_texcoord0.xy = texgen_object(vec4(position, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy; - +    vary_texcoord0.xy = texgen_object(vec4(position, 1.0), texture_matrix0, object_plane_s, object_plane_t); +          vec4 t = vec4(texcoord1,0,1); - +          vary_texcoord0.zw = t.xy;      vary_texcoord1.xy = t.xy-vec2(2.0, 0.0);      vary_texcoord1.zw = t.xy-vec2(1.0, 0.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl index 8e641522e3..732333311c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -1,24 +1,24 @@ -/** +/**    * @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$   */ @@ -65,7 +65,7 @@ vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl      // Apply texture animation first to avoid shearing and other artifacts      texcoord = (sl_animation_transform * vec4(texcoord, 0, 1)).xy;      // Convert to left-handed coordinate system. The offset of 1 is necessary -    // for rotations to be applied correctly. +    // for rotation and scale to be applied correctly.      texcoord.y = 1.0 - texcoord.y;      texcoord = khr_texture_transform(texcoord, khr_gltf_transform[0].xy, khr_gltf_transform[0].z, khr_gltf_transform[1].xy);      // Convert back to right-handed coordinate system diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl index db6070f328..708acd0194 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file treeF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -32,22 +32,23 @@ uniform sampler2D diffuseMap;  in vec4 vertex_color;  in vec3 vary_normal;  in vec2 vary_texcoord0; +in vec3 vary_position;  uniform float minimum_alpha; -vec2 encode_normal(vec3 n); - -void main() +void mirrorClip(vec3 pos); +void main()   { -    vec4 col = texture(diffuseMap, vary_texcoord0.xy); -    if (col.a < minimum_alpha) -    { -        discard; -    } - -    frag_data[0] = vec4(vertex_color.rgb*col.rgb, 0.0); -    frag_data[1] = vec4(0,0,0,0); -    vec3 nvn = normalize(vary_normal); -    frag_data[2] = vec4(encode_normal(nvn.xyz), 0.0, GBUFFER_FLAG_HAS_ATMOS); +    mirrorClip(vary_position); +	vec4 col = texture(diffuseMap, vary_texcoord0.xy); +	if (col.a < minimum_alpha) +	{ +		discard; +	} + +	frag_data[0] = vec4(vertex_color.rgb*col.rgb, 0.0); +	frag_data[1] = vec4(0,0,0,0); +	vec3 nvn = normalize(vary_normal); +	frag_data[2] = vec4(nvn.xyz, GBUFFER_FLAG_HAS_ATMOS);      frag_data[3] = vec4(0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl index 81900fba70..c84fccd4c6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl @@ -1,29 +1,30 @@ -/** +/**    * @file treeV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */  uniform mat4 texture_matrix0; +uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  uniform mat3 normal_matrix; @@ -34,14 +35,17 @@ in vec2 texcoord0;  out vec3 vary_normal;  out vec4 vertex_color;  out vec2 vary_texcoord0; +out vec3 vary_position;  void main()  { -    //transform vertex -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	//transform vertex +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  +    vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; -    vary_normal = normalize(normal_matrix * normal); +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	 +	vary_normal = normalize(normal_matrix * normal); -    vertex_color = vec4(1,1,1,1); +	vertex_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl b/indra/newview/app_settings/shaders/class1/interface/normaldebugF.glsl index ca3e4f6718..388042e7e0 100644 --- a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/normaldebugF.glsl @@ -1,34 +1,33 @@ -/** - * @file encodeNormF.glsl +/**  + * @file normaldebugF.glsl   * - * $LicenseInfo:firstyear=2018&license=viewerlgpl$ + * $LicenseInfo:firstyear=2023&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2018, Linden Research, Inc. - * + * 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$   */ -// Lambert Azimuthal Equal-Area projection -// See: https://aras-p.info/texts/CompactNormalStorage.html -// Also see: A_bit_more_deferred_-_CryEngine3.ppt -vec2 encode_normal(vec3 n) +out vec4 frag_color; + +in vec4 vertex_color; + +void main()   { -    float f = sqrt(8 * n.z + 8); -    return n.xy / f + 0.5; +	frag_color = max(vertex_color, vec4(0));  } - diff --git a/indra/newview/app_settings/shaders/class1/interface/normaldebugG.glsl b/indra/newview/app_settings/shaders/class1/interface/normaldebugG.glsl new file mode 100644 index 0000000000..51d05cd507 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/normaldebugG.glsl @@ -0,0 +1,76 @@ +/**  + * @file normaldebugG.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$ + */ + +// *NOTE: Geometry shaders have a reputation for being slow. Consider using +// compute shaders instead, which have a reputation for being fast. This +// geometry shader in particular seems to run fine on my machine, but I won't +// vouch for this in performance-critical areas. +// -Cosmic,2023-09-28 + +out vec4 vertex_color; + +in vec4 normal_g[]; +#ifdef HAS_ATTRIBUTE_TANGENT +in vec4 tangent_g[]; +#endif + +layout(triangles) in; +#ifdef HAS_ATTRIBUTE_TANGENT +layout(line_strip, max_vertices = 12) out; +#else +layout(line_strip, max_vertices = 6) out; +#endif + +void triangle_normal_debug(int i) +{ +    // Normal +    vec4 normal_color = vec4(1.0, 1.0, 0.0, 1.0); +    gl_Position = gl_in[i].gl_Position; +    vertex_color = normal_color; +    EmitVertex(); +    gl_Position = normal_g[i]; +    vertex_color = normal_color; +    EmitVertex(); +    EndPrimitive(); + +#ifdef HAS_ATTRIBUTE_TANGENT +    // Tangent +    vec4 tangent_color = vec4(0.0, 1.0, 1.0, 1.0); +    gl_Position = gl_in[i].gl_Position; +    vertex_color = tangent_color; +    EmitVertex(); +    gl_Position = tangent_g[i]; +    vertex_color = tangent_color; +    EmitVertex(); +    EndPrimitive(); +#endif +} + +void main() +{ +    triangle_normal_debug(0); +    triangle_normal_debug(1); +    triangle_normal_debug(2); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/normaldebugV.glsl b/indra/newview/app_settings/shaders/class1/interface/normaldebugV.glsl new file mode 100644 index 0000000000..b198bc2485 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/normaldebugV.glsl @@ -0,0 +1,74 @@ +/**  + * @file normaldebugV.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$ + */ + +in vec3 position; +in vec3 normal; +out vec4 normal_g; +#ifdef HAS_ATTRIBUTE_TANGENT +in vec4 tangent; +out vec4 tangent_g; +#endif + +uniform float debug_normal_draw_length; + +#ifdef HAS_SKIN +mat4 getObjectSkinnedTransform(); +#else +uniform mat3 normal_matrix; +#endif +uniform mat4 projection_matrix; +uniform mat4 modelview_matrix; + +// *NOTE: Should use the modelview_projection_matrix here in the non-skinned +// case for efficiency, but opting for the simplier implementation for now as +// this is debug code. Also, the skinned version hasn't beeen tested yet. +// world_pos = mat * vec4(position.xyz, 1.0) +vec4 get_screen_normal(vec3 position, vec4 world_pos, vec3 normal, mat4 mat) +{ +    vec4 world_norm = mat * vec4((position + normal), 1.0); +    world_norm.xyz -= world_pos.xyz; +    world_norm.xyz = debug_normal_draw_length * normalize(world_norm.xyz); +    world_norm.xyz += world_pos.xyz; +    return projection_matrix * world_norm; +} + +void main() +{ +#ifdef HAS_SKIN +    mat4 mat = getObjectSkinnedTransform(); +    mat = modelview_matrix * mat; +#else +#define mat modelview_matrix +#endif + +    vec4 world_pos = mat * vec4(position.xyz,1.0); + +	gl_Position = projection_matrix * world_pos; +	normal_g = get_screen_normal(position.xyz, world_pos, normal.xyz, mat); +#ifdef HAS_ATTRIBUTE_TANGENT +	tangent_g = get_screen_normal(position.xyz, world_pos, tangent.xyz, mat); +#endif +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl index eb0f7297ad..c1ed1bfe6e 100644 --- a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl @@ -1,28 +1,28 @@ -/** +/**    * @file radianceGenF.glsl   *   * $LicenseInfo:firstyear=2022&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2022, 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$   */ - +   /*[EXTRA_CODE_HERE]*/ @@ -36,8 +36,9 @@ in vec3 vary_dir;  //uniform float roughness;  uniform float mipLevel; -uniform int u_width; +uniform int u_width;   uniform float max_probe_lod; +uniform float probe_strength;  // ============================================================================================================= @@ -73,95 +74,96 @@ const float PI = 3.1415926536;  // Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/  float random(vec2 co)  { -    float a = 12.9898; -    float b = 78.233; -    float c = 43758.5453; -    float dt= dot(co.xy ,vec2(a,b)); -    float sn= mod(dt,3.14); -    return fract(sin(sn) * c); +	float a = 12.9898; +	float b = 78.233; +	float c = 43758.5453; +	float dt= dot(co.xy ,vec2(a,b)); +	float sn= mod(dt,3.14); +	return fract(sin(sn) * c);  } -vec2 hammersley2d(uint i, uint N) +vec2 hammersley2d(uint i, uint N)   { -    // Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html -    uint bits = (i << 16u) | (i >> 16u); -    bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); -    bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); -    bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); -    bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); -    float rdi = float(bits) * 2.3283064365386963e-10; -    return vec2(float(i) /float(N), rdi); +	// Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html +	uint bits = (i << 16u) | (i >> 16u); +	bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); +	bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); +	bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); +	bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); +	float rdi = float(bits) * 2.3283064365386963e-10; +	return vec2(float(i) /float(N), rdi);  }  // Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf -vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal) +vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal)   { -    // Maps a 2D point to a hemisphere with spread based on roughness -    float alpha = roughness * roughness; -    float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1; -    float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y)); -    float sinTheta = sqrt(1.0 - cosTheta * cosTheta); -    vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); - -    // Tangent space -    vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); -    vec3 tangentX = normalize(cross(up, normal)); -    vec3 tangentY = normalize(cross(normal, tangentX)); - -    // Convert to world Space -    return normalize(tangentX * H.x + tangentY * H.y + normal * H.z); +	// Maps a 2D point to a hemisphere with spread based on roughness +	float alpha = roughness * roughness; +	float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1; +	float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y)); +	float sinTheta = sqrt(1.0 - cosTheta * cosTheta); +	vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); + +	// Tangent space +	vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); +	vec3 tangentX = normalize(cross(up, normal)); +	vec3 tangentY = normalize(cross(normal, tangentX)); + +	// Convert to world Space +	return normalize(tangentX * H.x + tangentY * H.y + normal * H.z);  }  // Normal Distribution function  float D_GGX(float dotNH, float roughness)  { -    float alpha = roughness * roughness; -    float alpha2 = alpha * alpha; -    float denom = dotNH * dotNH * (alpha2 - 1.0) + 1.0; -    return (alpha2)/(PI * denom*denom); +	float alpha = roughness * roughness; +	float alpha2 = alpha * alpha; +	float denom = dotNH * dotNH * (alpha2 - 1.0) + 1.0; +	return (alpha2)/(PI * denom*denom);   }  vec4 prefilterEnvMap(vec3 R)  { -    vec3 N = R; -    vec3 V = R; -    vec4 color = vec4(0.0); -    float totalWeight = 0.0; -    float envMapDim = float(textureSize(reflectionProbes, 0).s); +	vec3 N = R; +	vec3 V = R; +	vec4 color = vec4(0.0); +	float totalWeight = 0.0; +	float envMapDim = float(textureSize(reflectionProbes, 0).s);      float roughness = mipLevel/max_probe_lod; -    int numSamples = max(int(32*roughness), 1); +    int numSamples = max(int(PROBE_FILTER_SAMPLES*roughness), 1);      float numMips = max_probe_lod+1; -    for(uint i = 0u; i < numSamples; i++) { -        vec2 Xi = hammersley2d(i, numSamples); -        vec3 H = importanceSample_GGX(Xi, roughness, N); -        vec3 L = 2.0 * dot(V, H) * H - V; -        float dotNL = clamp(dot(N, L), 0.0, 1.0); -        if(dotNL > 0.0) { -            // Filtering based on https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/ - -            float dotNH = clamp(dot(N, H), 0.0, 1.0); -            float dotVH = clamp(dot(V, H), 0.0, 1.0); - -            // Probability Distribution Function -            float pdf = D_GGX(dotNH, roughness) * dotNH / (4.0 * dotVH) + 0.0001; -            // Slid angle of current smple -            float omegaS = 1.0 / (float(numSamples) * pdf); -            // Solid angle of 1 pixel across all cube faces -            float omegaP = 4.0 * PI / (6.0 * envMapDim * envMapDim); -            // Biased (+1.0) mip level for better result -            float mipLevel = roughness == 0.0 ? 0.0 : clamp(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f, max_probe_lod); -            color += textureLod(reflectionProbes, vec4(L, sourceIdx), mipLevel) * dotNL; -            totalWeight += dotNL; -        } -    } -    return (color / totalWeight); +	for(uint i = 0u; i < numSamples; i++) { +		vec2 Xi = hammersley2d(i, numSamples); +		vec3 H = importanceSample_GGX(Xi, roughness, N); +		vec3 L = 2.0 * dot(V, H) * H - V; +		float dotNL = clamp(dot(N, L), 0.0, 1.0); +		if(dotNL > 0.0) { +			// Filtering based on https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/ + +			float dotNH = clamp(dot(N, H), 0.0, 1.0); +			float dotVH = clamp(dot(V, H), 0.0, 1.0); + +			// Probability Distribution Function +			float pdf = D_GGX(dotNH, roughness) * dotNH / (4.0 * dotVH) + 0.0001; +			// Slid angle of current smple +			float omegaS = 1.0 / (float(numSamples) * pdf); +			// Solid angle of 1 pixel across all cube faces +			float omegaP = 4.0 * PI / (6.0 * envMapDim * envMapDim); +			// Biased (+1.0) mip level for better result +			float mipLevel = roughness == 0.0 ? 0.0 : clamp(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f, max_probe_lod); +			color += textureLod(reflectionProbes, vec4(L, sourceIdx), mipLevel) * dotNL; +			totalWeight += dotNL; +		} +	} +	return (color / totalWeight);  }  void main() -{ -    vec3 N = normalize(vary_dir); -    frag_color = max(prefilterEnvMap(N), vec4(0)); +{		 +	vec3 N = normalize(vary_dir); +	frag_color = max(prefilterEnvMap(N), vec4(0)); +    frag_color.a *= probe_strength;  }  // ============================================================================================================= diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl index db26e64f17..142f2a5d71 100644 --- a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl @@ -1,24 +1,24 @@ -/** +/**    * @file bumpF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ @@ -30,11 +30,15 @@ uniform sampler2D texture1;  in vec2 vary_texcoord0;  in vec2 vary_texcoord1; +in vec3 vary_position; + +void mirrorClip(vec3 pos); -void main() +void main()   { -    float tex0 = texture(texture0, vary_texcoord0.xy).a; -    float tex1 = texture(texture1, vary_texcoord1.xy).a; +    mirrorClip(vary_position); +	float tex0 = texture(texture0, vary_texcoord0.xy).a; +	float tex1 = texture(texture1, vary_texcoord1.xy).a; -    frag_color = max(vec4(tex0+(1.0-tex1)-0.5), vec4(0)); +	frag_color = max(vec4(tex0+(1.0-tex1)-0.5), vec4(0));  } diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl index 834c20e14d..b8a02fbdec 100644 --- a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl @@ -1,28 +1,29 @@ -/** +/**    * @file bumpV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, 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$   */ +uniform mat4 modelview_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_projection_matrix; @@ -32,24 +33,26 @@ in vec2 texcoord1;  out vec2 vary_texcoord0;  out vec2 vary_texcoord1; +out vec3 vary_position;  #ifdef HAS_SKIN  mat4 getObjectSkinnedTransform();  uniform mat4 projection_matrix; -uniform mat4 modelview_matrix;  #endif  void main()  { -    //transform vertex +	//transform vertex  #ifdef HAS_SKIN      mat4 mat = getObjectSkinnedTransform();      mat = modelview_matrix * mat;      vec4 pos = mat * vec4(position.xyz, 1.0); +    vary_position = pos.xyz;      gl_Position = projection_matrix * pos;  #else -    gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); +    vary_position = (modelview_matrix * vec4(position.xyz, 1.0)).xyz; +	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  #endif -    vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -    vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy; +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy;  } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index b7cd3f0589..40b7f9cf0e 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -57,16 +57,16 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou      vec3  rel_pos_norm = normalize(rel_pos);      float rel_pos_len  = length(rel_pos); - +          vec3  sunlight     = (sun_up_factor == 1) ? sunlight_color: moonlight_color; - +          // sunlight attenuation effect (hue and brightness) due to atmosphere      // this is used later for sunlight modulation at various altitudes      vec3 light_atten = (blue_density + vec3(haze_density * 0.25)) * (density_multiplier * max_y);      // I had thought blue_density and haze_density should have equal weighting,      // but attenuation due to haze_density tends to seem too strong -    vec3 combined_haze = blue_density + vec3(haze_density); +    vec3 combined_haze = max(blue_density + vec3(haze_density), vec3(1e-6));      vec3 blue_weight   = blue_density / combined_haze;      vec3 haze_weight   = vec3(haze_density) / combined_haze; @@ -98,7 +98,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou      haze_glow = max(haze_glow, .001);  // set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)      haze_glow *= glow.x;      // higher glow.x gives dimmer glow (because next step is 1 / "angle") -    haze_glow = pow(haze_glow, glow.z); +    haze_glow = clamp(pow(haze_glow, glow.z), -10, 10);      // glow.z should be negative, so we're doing a sort of (1 / "angle") function      // add "minimum anti-solar illumination" @@ -119,7 +119,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou      additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb);      // brightness of surface both sunlight and ambient - +          sunlit = sunlight.rgb;      amblit = tmpAmbient; @@ -128,7 +128,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou  vec3 srgb_to_linear(vec3 col); -// provide a touch of lighting in the opposite direction of the sun light +// provide a touch of lighting in the opposite direction of the sun light       // so areas in shadow don't lose all detail  float ambientLighting(vec3 norm, vec3 light_dir)  { @@ -150,7 +150,7 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou      // (allows for mixing of light sources other than sunlight e.g. reflection probes)      sunlit *= sky_sunlight_scale;      amblit *= sky_ambient_scale; - +          amblit = srgb_to_linear(amblit);      amblit *= ambientLighting(norm, light_dir);  } | 
