Merge branch 'DRTVWR-559' of https://bitbucket.org/lindenlab/viewer
# Conflicts: # indra/newview/app_settings/settings.xml # indra/newview/lldrawpoolbump.cpp # indra/newview/llfloaterpreference.cpp # indra/newview/llspatialpartition.h # indra/newview/pipeline.cpp # indra/newview/skins/default/xui/en/panel_preferences_graphics1.xmlmaster
commit
47e14546b9
|
|
@ -12591,6 +12591,18 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderPBR</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use PBR rendering pipeline (Physically Based Rendering).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderDeferred</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -35,11 +35,10 @@ out vec4 frag_color;
|
|||
uniform sampler2D diffuseMap;
|
||||
#endif
|
||||
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec3 vary_texcoord1;
|
||||
VARYING vec3 vary_position;
|
||||
VARYING vec4 vary_position;
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
|
||||
|
|
@ -55,14 +54,6 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
|
|||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
#endif
|
||||
|
||||
// See:
|
||||
// class1\deferred\fullbrightShinyF.glsl
|
||||
// class1\lighting\lightFullbrightShinyF.glsl
|
||||
|
|
@ -79,29 +70,21 @@ void main()
|
|||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
vec3 pos = vary_position;
|
||||
calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
vec3 pos = vary_position.xyz/vary_position.w;
|
||||
|
||||
float env_intensity = vertex_color.a;
|
||||
#ifndef HAS_REFLECTION_PROBES
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
#else
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
vec3 norm = normalize(vary_texcoord1.xyz);
|
||||
vec4 spec = vec4(0,0,0,0);
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity);
|
||||
legacyenv *= 1.5; // fudge brighter
|
||||
applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);
|
||||
#endif
|
||||
color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
float env_intensity = vertex_color.a;
|
||||
|
||||
//color.rgb = srgb_to_linear(color.rgb);
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -115,6 +98,7 @@ void main()
|
|||
*/
|
||||
|
||||
color.a = 1.0;
|
||||
|
||||
//color.rgb = linear_to_srgb(color.rgb);
|
||||
|
||||
frag_color = color;
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ void main()
|
|||
#endif
|
||||
|
||||
vary_position = pos.xyz;
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
#ifndef HAS_REFLECTION_PROBES
|
||||
vec3 ref = reflect(pos.xyz, -norm);
|
||||
|
|
|
|||
|
|
@ -64,13 +64,6 @@ out vec4 frag_color;
|
|||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
#endif
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
|
|
@ -329,16 +322,6 @@ void main()
|
|||
// lighting from the sun stays sharp
|
||||
float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
|
||||
da = pow(da, 1.0 / 1.3);
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit;
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
|
||||
amblit = max(ambenv, amblit);
|
||||
color.rgb = amblit;
|
||||
#else
|
||||
|
||||
color = amblit;
|
||||
|
||||
|
|
@ -350,8 +333,9 @@ void main()
|
|||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit;
|
||||
|
||||
color *= ambient;
|
||||
#endif
|
||||
|
||||
color += sun_contrib;
|
||||
|
||||
|
|
@ -361,6 +345,35 @@ void main()
|
|||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
/* // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020
|
||||
// Preserving the refactored version as a comment for potential reconsideration,
|
||||
// overriding the general rule to avoid pollutiong the source with commented code.
|
||||
//
|
||||
// If you're reading this in 2021+, feel free to obliterate.
|
||||
|
||||
vec3 npos = -normalize(pos.xyz);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(light_dir.xyz + npos);
|
||||
float nh = dot(norm.xyz, h);
|
||||
float nv = dot(norm.xyz, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 sp = sun_contrib*scol / 6.0f;
|
||||
sp = clamp(sp, vec3(0), vec3(1));
|
||||
bloom = dot(sp, sp) / 4.0;
|
||||
color += sp * spec.rgb;
|
||||
}
|
||||
*/
|
||||
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
|
|
@ -372,24 +385,10 @@ void main()
|
|||
glare = max(glare, spec_contrib.b);
|
||||
|
||||
color += spec_contrib;
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
color = mix(color.rgb, diffcol.rgb, diffuse.a);
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
if (envIntensity > 0.0)
|
||||
{ // add environmentmap
|
||||
//fudge darker
|
||||
legacyenv *= 0.5*diffuse.a+0.5;
|
||||
|
||||
applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
|
||||
}
|
||||
#else
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
//add environmentmap
|
||||
|
|
@ -404,7 +403,6 @@ void main()
|
|||
cur_glare *= envIntensity*4.0;
|
||||
glare += cur_glare;
|
||||
}
|
||||
#endif
|
||||
|
||||
color = atmosFragLighting(color, additive, atten);
|
||||
color = scaleSoftClipFrag(color);
|
||||
|
|
|
|||
|
|
@ -26,10 +26,7 @@
|
|||
#extension GL_ARB_texture_rectangle : enable
|
||||
#extension GL_ARB_shader_texture_lod : enable
|
||||
|
||||
#define FLT_MAX 3.402823466e+38
|
||||
|
||||
#define REFMAP_COUNT 256
|
||||
#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
|
|
@ -42,6 +39,7 @@ uniform sampler2DRect specularRect;
|
|||
uniform sampler2DRect normalMap;
|
||||
uniform sampler2DRect lightMap;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform float blur_size;
|
||||
|
|
@ -68,12 +66,6 @@ vec3 scaleSoftClipFrag(vec3 l);
|
|||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
|
|
@ -111,53 +103,40 @@ void main()
|
|||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
|
||||
|
||||
//vec3 amb_vec = env_mat * norm.xyz;
|
||||
color.rgb = amblit;
|
||||
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
|
||||
|
||||
amblit = max(ambenv, amblit);
|
||||
color.rgb = amblit*ambocc;
|
||||
|
||||
//float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
//ambient *= 0.5;
|
||||
//ambient *= ambient;
|
||||
//ambient = (1.0 - ambient);
|
||||
//color.rgb *= ambient;
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
color.rgb *= ambient;
|
||||
|
||||
vec3 sun_contrib = min(da, scol) * sunlit;
|
||||
color.rgb += sun_contrib;
|
||||
color.rgb = min(color.rgb, vec3(1,1,1));
|
||||
color.rgb *= diffuse.rgb;
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
float sa = dot(normalize(refnormpersp), light_dir.xyz);
|
||||
float sa = dot(refnormpersp, light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
color.rgb += spec_contrib;
|
||||
|
||||
// add reflection map - EXPERIMENTAL WORK IN PROGRESS
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
}
|
||||
|
||||
color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{ // add environmentmap
|
||||
//fudge darker
|
||||
legacyenv *= 0.5*diffuse.a+0.5;;
|
||||
applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
color = mix(color.rgb, reflected_color, envIntensity);
|
||||
}
|
||||
|
||||
if (norm.w < 0.5)
|
||||
|
|
@ -174,9 +153,6 @@ void main()
|
|||
|
||||
// convert to linear as fullscreen lights need to sum in linear colorspace
|
||||
// and will be gamma (re)corrected downstream...
|
||||
//color = vec3(ambocc);
|
||||
//color = ambenv;
|
||||
//color.b = diffuse.a;
|
||||
frag_color.rgb = srgb_to_linear(color.rgb);
|
||||
frag_color.a = bloom;
|
||||
frag_color.a = bloom;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* @file avatarShadowF.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]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec4 computeMoments(float depth, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
frag_color = computeMoments(length(pos), 1.0);
|
||||
}
|
||||
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* @file attachmentShadowV.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;
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 texture_matrix0;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
mat4 getObjectSkinnedTransform();
|
||||
|
||||
VARYING vec4 pos;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
|
||||
mat = modelview_matrix * mat;
|
||||
pos = (mat*vec4(position.xyz, 1.0));
|
||||
pos = projection_matrix * vec4(pos.xyz, 1.0);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
pos.z = max(pos.z, -pos.w+0.01);
|
||||
#endif
|
||||
gl_Position = pos;
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
/**
|
||||
* @file avatarShadowF.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]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
|
||||
vec4 computeMoments(float depth, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
frag_color = computeMoments(length(pos), 1.0);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/**
|
||||
* @file avatarShadowV.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;
|
||||
|
||||
mat4 getSkinnedTransform();
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
|
||||
void main()
|
||||
{
|
||||
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);
|
||||
|
||||
pos = projection_matrix * pos;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
post_pos = pos;
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/cloudsF.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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING float target_pos_x;
|
||||
VARYING float vary_CloudDensity;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
|
||||
uniform sampler2D cloud_noise_texture;
|
||||
uniform sampler2D cloud_noise_texture_next;
|
||||
uniform float blend_factor;
|
||||
uniform vec4 cloud_pos_density1;
|
||||
uniform vec4 cloud_pos_density2;
|
||||
uniform vec4 cloud_color;
|
||||
uniform float cloud_shadow;
|
||||
uniform float cloud_scale;
|
||||
uniform float cloud_variance;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform vec3 sun_dir;
|
||||
uniform float sun_size;
|
||||
uniform float far_z;
|
||||
|
||||
vec4 cloudNoise(vec2 uv)
|
||||
{
|
||||
vec4 a = texture2D(cloud_noise_texture, uv);
|
||||
vec4 b = texture2D(cloud_noise_texture_next, uv);
|
||||
vec4 cloud_noise_sample = mix(a, b, blend_factor);
|
||||
return normalize(cloud_noise_sample);
|
||||
}
|
||||
|
||||
vec4 computeMoments(float depth, float alpha);
|
||||
|
||||
void main()
|
||||
{
|
||||
if (cloud_scale >= 0.001)
|
||||
{
|
||||
// Set variables
|
||||
vec2 uv1 = vary_texcoord0.xy;
|
||||
vec2 uv2 = vary_texcoord1.xy;
|
||||
vec2 uv3 = vary_texcoord2.xy;
|
||||
float cloudDensity = 2.0 * (cloud_shadow - 0.25);
|
||||
|
||||
vec2 uv4 = vary_texcoord3.xy;
|
||||
|
||||
vec2 disturbance = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
|
||||
vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
|
||||
|
||||
// Offset texture coords
|
||||
uv1 += cloud_pos_density1.xy + (disturbance * 0.2); //large texture, visible density
|
||||
uv2 += cloud_pos_density1.xy; //large texture, self shadow
|
||||
uv3 += cloud_pos_density2.xy; //small texture, visible density
|
||||
uv4 += cloud_pos_density2.xy; //small texture, self shadow
|
||||
|
||||
float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y) * 4.0);
|
||||
|
||||
cloudDensity *= 1.0 - (density_variance * density_variance);
|
||||
|
||||
// Compute alpha1, the main cloud opacity
|
||||
float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z;
|
||||
alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.);
|
||||
|
||||
// And smooth
|
||||
alpha1 = 1. - alpha1 * alpha1;
|
||||
alpha1 = 1. - alpha1 * alpha1;
|
||||
|
||||
if (alpha1 < 0.001f)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
// Compute alpha2, for self shadowing effect
|
||||
// (1 - alpha2) will later be used as percentage of incoming sunlight
|
||||
float alpha2 = (cloudNoise(uv2).x - 0.5);
|
||||
alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
|
||||
|
||||
// And smooth
|
||||
alpha2 = 1. - alpha2;
|
||||
alpha2 = 1. - alpha2 * alpha2;
|
||||
|
||||
frag_color = computeMoments(length(pos), alpha1);
|
||||
}
|
||||
else
|
||||
{
|
||||
frag_color = vec4(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
/**
|
||||
* @file cloudShadowV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform float shadow_target_width;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec4 vertex_color;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
pos = modelview_projection_matrix * pre_pos;
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
pos_zd2 = pos.z * 0.5;
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
|
||||
passTextureIndex();
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
@ -1,166 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/cloudsF.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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// The fragment shader for the sky
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
VARYING vec4 vary_CloudColorSun;
|
||||
VARYING vec4 vary_CloudColorAmbient;
|
||||
VARYING float vary_CloudDensity;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
VARYING vec3 vary_pos;
|
||||
|
||||
uniform sampler2D cloud_noise_texture;
|
||||
uniform sampler2D cloud_noise_texture_next;
|
||||
uniform float blend_factor;
|
||||
uniform vec4 cloud_pos_density1;
|
||||
uniform vec4 cloud_pos_density2;
|
||||
uniform vec4 cloud_color;
|
||||
uniform float cloud_shadow;
|
||||
uniform float cloud_scale;
|
||||
uniform float cloud_variance;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform vec3 sun_dir;
|
||||
uniform float sun_size;
|
||||
uniform float far_z;
|
||||
|
||||
uniform sampler2D transmittance_texture;
|
||||
uniform sampler3D scattering_texture;
|
||||
uniform sampler3D single_mie_scattering_texture;
|
||||
uniform sampler2D irradiance_texture;
|
||||
uniform sampler2D sh_input_r;
|
||||
uniform sampler2D sh_input_g;
|
||||
uniform sampler2D sh_input_b;
|
||||
|
||||
vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
|
||||
/// Soft clips the light with a gamma correction
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
vec4 cloudNoise(vec2 uv)
|
||||
{
|
||||
vec4 a = texture2D(cloud_noise_texture, uv);
|
||||
vec4 b = texture2D(cloud_noise_texture_next, uv);
|
||||
vec4 cloud_noise_sample = mix(a, b, blend_factor);
|
||||
return cloud_noise_sample;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
// Set variables
|
||||
vec2 uv1 = vary_texcoord0.xy;
|
||||
vec2 uv2 = vary_texcoord1.xy;
|
||||
vec2 uv3 = vary_texcoord2.xy;
|
||||
float cloudDensity = 2.0 * (cloud_shadow - 0.25);
|
||||
|
||||
if (cloud_scale < 0.001)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec2 uv4 = vary_texcoord3.xy;
|
||||
|
||||
vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f);
|
||||
|
||||
// Offset texture coords
|
||||
uv1 += cloud_pos_density1.xy + (disturbance * 0.2); //large texture, visible density
|
||||
uv2 += cloud_pos_density1.xy; //large texture, self shadow
|
||||
uv3 += cloud_pos_density2.xy; //small texture, visible density
|
||||
uv4 += cloud_pos_density2.xy; //small texture, self shadow
|
||||
|
||||
float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0) * 4.0);
|
||||
|
||||
cloudDensity *= 1.0 - (density_variance * density_variance);
|
||||
|
||||
// Compute alpha1, the main cloud opacity
|
||||
float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z;
|
||||
alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.);
|
||||
|
||||
// And smooth
|
||||
alpha1 = 1. - alpha1 * alpha1;
|
||||
alpha1 = 1. - alpha1 * alpha1;
|
||||
|
||||
if (alpha1 < 0.001f)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
// Compute alpha2, for self shadowing effect
|
||||
// (1 - alpha2) will later be used as percentage of incoming sunlight
|
||||
float alpha2 = (cloudNoise(uv2).x - 0.5);
|
||||
alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
|
||||
|
||||
// And smooth
|
||||
alpha2 = 1. - alpha2;
|
||||
alpha2 = 1. - alpha2 * alpha2;
|
||||
|
||||
vec3 view_ray = vary_pos.xyz + camPosLocal;
|
||||
|
||||
vec3 view_direction = normalize(view_ray);
|
||||
vec3 sun_direction = normalize(sun_dir);
|
||||
vec3 earth_center = vec3(0, 0, -6360.0f);
|
||||
vec3 camPos = (camPosLocal / 1000.0f) - earth_center;
|
||||
|
||||
vec3 transmittance;
|
||||
vec3 radiance_sun = GetSkyLuminance(camPos, view_direction, 1.0 - alpha1, sun_direction, transmittance);
|
||||
|
||||
vec3 sun_color = vec3(1.0) - exp(-radiance_sun * 0.0001);
|
||||
|
||||
// Combine
|
||||
vec4 color;
|
||||
|
||||
vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
|
||||
|
||||
vec4 l1r = texture2D(sh_input_r, vec2(0,0));
|
||||
vec4 l1g = texture2D(sh_input_g, vec2(0,0));
|
||||
vec4 l1b = texture2D(sh_input_b, vec2(0,0));
|
||||
|
||||
vec3 sun_indir = vec3(-view_direction.xy, view_direction.z);
|
||||
vec3 amb = vec3(dot(l1r, l1tap * vec4(1, sun_indir)),
|
||||
dot(l1g, l1tap * vec4(1, sun_indir)),
|
||||
dot(l1b, l1tap * vec4(1, sun_indir)));
|
||||
|
||||
|
||||
amb = max(vec3(0), amb);
|
||||
|
||||
color.rgb = sun_color * cloud_color.rgb * (1. - alpha2);
|
||||
color.rgb = pow(color.rgb, vec3(1.0 / 2.2));
|
||||
color.rgb += amb;
|
||||
|
||||
frag_data[0] = vec4(color.rgb, alpha1);
|
||||
frag_data[1] = vec4(0);
|
||||
frag_data[2] = vec4(0,1,0,1);
|
||||
}
|
||||
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
/**
|
||||
* @file WLCloudsV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform mat4 modelview_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// The vertex shader for creating the atmospheric sky
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Output parameters
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
VARYING vec3 vary_pos;
|
||||
|
||||
// Inputs
|
||||
uniform float cloud_scale;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
void main()
|
||||
{
|
||||
vary_pos = position;
|
||||
|
||||
// World / view / projection
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
// Texture coords
|
||||
vary_texcoord0 = texcoord0;
|
||||
vary_texcoord0.xy -= 0.5;
|
||||
vary_texcoord0.xy /= max(0.001, cloud_scale);
|
||||
vary_texcoord0.xy += 0.5;
|
||||
|
||||
vary_texcoord1 = vary_texcoord0;
|
||||
vary_texcoord1.x += lightnorm.x * 0.0125;
|
||||
vary_texcoord1.y += lightnorm.z * 0.0125;
|
||||
|
||||
vary_texcoord2 = vary_texcoord0 * 16.;
|
||||
vary_texcoord3 = vary_texcoord1 * 16.;
|
||||
|
||||
// END CLOUDS
|
||||
}
|
||||
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
/**
|
||||
* @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$
|
||||
*/
|
||||
|
||||
uniform sampler2DRect normalMap;
|
||||
uniform sampler2DRect depthMap;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
vec2 getScreenCoordinate(vec2 screenpos)
|
||||
{
|
||||
vec2 sc = screenpos.xy * 2.0;
|
||||
if (screen_res.x > 0 && screen_res.y > 0)
|
||||
{
|
||||
sc /= screen_res;
|
||||
}
|
||||
return sc - vec2(1.0, 1.0);
|
||||
}
|
||||
|
||||
vec3 getNorm(vec2 screenpos)
|
||||
{
|
||||
vec2 enc = texture2DRect(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;
|
||||
}
|
||||
|
||||
float getDepth(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen).r;
|
||||
return depth;
|
||||
}
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = getDepth(pos_screen);
|
||||
vec2 sc = getScreenCoordinate(pos_screen);
|
||||
vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
|
||||
vec4 pos = inv_proj * ndc;
|
||||
pos /= pos.w;
|
||||
pos.w = 1.0;
|
||||
return pos;
|
||||
}
|
||||
|
||||
vec4 getPositionWithDepth(vec2 pos_screen, float depth)
|
||||
{
|
||||
vec2 sc = getScreenCoordinate(pos_screen);
|
||||
vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
|
||||
vec4 pos = inv_proj * ndc;
|
||||
pos /= pos.w;
|
||||
pos.w = 1.0;
|
||||
return pos;
|
||||
}
|
||||
|
|
@ -1,202 +0,0 @@
|
|||
/**
|
||||
* @file depthToShadowVolumeG.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$
|
||||
*/
|
||||
#extension GL_ARB_geometry_shader4 : enable
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
layout (triangles) in;
|
||||
layout (triangle_strip, max_vertices = 128) out;
|
||||
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform mat4 shadowMatrix[6];
|
||||
uniform vec4 lightpos;
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
out vec3 to_vec;
|
||||
|
||||
void cross_products(out vec4 ns[3], int a, int b, int c)
|
||||
{
|
||||
ns[0] = cross(gl_PositionIn[b].xyz - gl_PositionIn[a].xyz, gl_PositionIn[c].xyz - gl_PositionIn[a].xyz);
|
||||
ns[1] = cross(gl_PositionIn[c].xyz - gl_PositionIn[b].xyz, gl_PositionIn[a].xyz - gl_PositionIn[b].xyz);
|
||||
ns[2] = cross(gl_PositionIn[a].xyz - gl_PositionIn[c].xyz, gl_PositionIn[b].xyz - gl_PositionIn[c].xyz);
|
||||
}
|
||||
|
||||
vec3 getLightDirection(vec4 lightpos, vec3 pos)
|
||||
{
|
||||
|
||||
vec3 lightdir = lightpos.xyz - lightpos.w * pos;
|
||||
return lightdir;
|
||||
}
|
||||
|
||||
void emitTri(vec4 v[3])
|
||||
{
|
||||
gl_Position = proj_matrix * v[0];
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = proj_matrix * v[1];
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = proj_matrix * v[2];
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
||||
void emitQuad(vec4 v[4]
|
||||
{
|
||||
// Emit a quad as a triangle strip.
|
||||
gl_Position = proj_matrix*v[0];
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = proj_matrix*v[1];
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = proj_matrix*v[2];
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = proj_matrix*v[3];
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
||||
void emitPrimitives(int layer)
|
||||
{
|
||||
int i = layer;
|
||||
gl_Layer = i;
|
||||
|
||||
vec4 depth1 = vec4(texture2DRect(depthMap, tc0).rg, texture2DRect(depthMap, tc1).rg));
|
||||
vec3 depth2 = vec4(texture2DRect(depthMap, tc2).rg, texture2DRect(depthMap, tc3).rg));
|
||||
vec3 depth3 = vec4(texture2DRect(depthMap, tc4).rg, texture2DRect(depthMap, tc5).rg));
|
||||
vec3 depth4 = vec4(texture2DRect(depthMap, tc6).rg, texture2DRect(depthMap, tc7).rg));
|
||||
|
||||
depth1 = min(depth1, depth2);
|
||||
depth1 = min(depth1, depth3);
|
||||
depth1 = min(depth1, depth4);
|
||||
|
||||
vec2 depth = min(depth1.xy, depth1.zw);
|
||||
|
||||
int side = sqrt(gl_VerticesIn);
|
||||
|
||||
for (int j = 0; j < side; j++)
|
||||
{
|
||||
for (int k = 0; k < side; ++k)
|
||||
{
|
||||
vec3 pos = gl_PositionIn[(j * side) + k].xyz;
|
||||
vec4 v = shadowMatrix[i] * vec4(pos, 1.0);
|
||||
gl_Position = v;
|
||||
to_vec = pos - light_position.xyz * depth;
|
||||
EmitVertex();
|
||||
}
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
||||
vec3 norms[3]; // Normals
|
||||
vec3 lightdir3]; // Directions toward light
|
||||
|
||||
vec4 v[4]; // Temporary vertices
|
||||
|
||||
vec4 or_pos[3] =
|
||||
{ // Triangle oriented toward light source
|
||||
gl_PositionIn[0],
|
||||
gl_PositionIn[2],
|
||||
gl_PositionIn[4]
|
||||
};
|
||||
|
||||
// Compute normal at each vertex.
|
||||
cross_products(n, 0, 2, 4);
|
||||
|
||||
// Compute direction from vertices to light.
|
||||
lightdir[0] = getLightDirection(lightpos, gl_PositionIn[0].xyz);
|
||||
lightdir[1] = getLightDirection(lightpos, gl_PositionIn[2].xyz);
|
||||
lightdir[2] = getLightDirection(lightpos, gl_PositionIn[4].xyz);
|
||||
|
||||
// Check if the main triangle faces the light.
|
||||
bool faces_light = true;
|
||||
if (!(dot(ns[0],d[0]) > 0
|
||||
|dot(ns[1],d[1]) > 0
|
||||
|dot(ns[2],d[2]) > 0))
|
||||
{
|
||||
// Flip vertex winding order in or_pos.
|
||||
or_pos[1] = gl_PositionIn[4];
|
||||
or_pos[2] = gl_PositionIn[2];
|
||||
faces_light = false;
|
||||
}
|
||||
|
||||
// Near cap: simply render triangle.
|
||||
emitTri(or_pos);
|
||||
|
||||
// Far cap: extrude positions to infinity.
|
||||
v[0] =vec4(lightpos.w * or_pos[0].xyz - lightpos.xyz,0);
|
||||
v[1] =vec4(lightpos.w * or_pos[2].xyz - lightpos.xyz,0);
|
||||
v[2] =vec4(lightpos.w * or_pos[1].xyz - lightpos.xyz,0);
|
||||
|
||||
emitTri(v);
|
||||
|
||||
// Loop over all edges and extrude if needed.
|
||||
for ( int i=0; i<3; i++ )
|
||||
{
|
||||
// Compute indices of neighbor triangle.
|
||||
int v0 = i*2;
|
||||
int nb = (i*2+1);
|
||||
int v1 = (i*2+2) % 6;
|
||||
cross_products(n, v0, nb, v1);
|
||||
|
||||
// Compute direction to light, again as above.
|
||||
d[0] =lightpos.xyz-lightpos.w*gl_PositionIn[v0].xyz;
|
||||
d[1] =lightpos.xyz-lightpos.w*gl_PositionIn[nb].xyz;
|
||||
d[2] =lightpos.xyz-lightpos.w*gl_PositionIn[v1].xyz;
|
||||
|
||||
bool is_parallel = gl_PositionIn[nb].w < 1e-5;
|
||||
|
||||
// Extrude the edge if it does not have a
|
||||
// neighbor, or if it's a possible silhouette.
|
||||
if (is_parallel ||
|
||||
( faces_light != (dot(ns[0],d[0])>0 ||
|
||||
dot(ns[1],d[1])>0 ||
|
||||
dot(ns[2],d[2])>0) ))
|
||||
{
|
||||
// Make sure sides are oriented correctly.
|
||||
int i0 = faces_light ? v0 : v1;
|
||||
int i1 = faces_light ? v1 : v0;
|
||||
|
||||
v[0] = gl_PositionIn[i0];
|
||||
v[1] = vec4(lightpos.w*gl_PositionIn[i0].xyz - lightpos.xyz, 0);
|
||||
v[2] = gl_PositionIn[i1];
|
||||
v[3] = vec4(lightpos.w*gl_PositionIn[i1].xyz - lightpos.xyz, 0);
|
||||
|
||||
emitQuad(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
// Output
|
||||
emitPrimitives(0);
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
/**
|
||||
* @file fullbrightShinyF.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]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
#ifndef HAS_DIFFUSE_LOOKUP
|
||||
uniform sampler2D diffuseMap;
|
||||
#endif
|
||||
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec3 vary_texcoord1;
|
||||
VARYING vec3 vary_position;
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 fullbrightShinyAtmosTransport(vec3 light);
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
#endif
|
||||
|
||||
// See:
|
||||
// class1\deferred\fullbrightShinyF.glsl
|
||||
// class1\lighting\lightFullbrightShinyF.glsl
|
||||
void main()
|
||||
{
|
||||
#ifdef HAS_DIFFUSE_LOOKUP
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
#else
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
#endif
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
vec3 pos = vary_position;
|
||||
calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
float env_intensity = vertex_color.a;
|
||||
#ifndef HAS_REFLECTION_PROBES
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
#else
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
vec3 norm = normalize(vary_texcoord1.xyz);
|
||||
vec4 spec = vec4(0,0,0,0);
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity);
|
||||
legacyenv *= 1.5; // fudge brighter
|
||||
applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);
|
||||
#endif
|
||||
color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
/*
|
||||
// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
|
||||
else
|
||||
{
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
float env_intensity = vertex_color.a;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
}
|
||||
*/
|
||||
|
||||
color.a = 1.0;
|
||||
//color.rgb = linear_to_srgb(color.rgb);
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/gatherSkyShF.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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
uniform sampler2D sh_input_r;
|
||||
uniform sampler2D sh_input_g;
|
||||
uniform sampler2D sh_input_b;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 offset = vec2(2.0) / screen_res;
|
||||
|
||||
vec4 r = vec4(0);
|
||||
vec4 g = vec4(0);
|
||||
vec4 b = vec4(0);
|
||||
|
||||
vec2 tc = vary_frag * 2.0;
|
||||
|
||||
r += texture2D(sh_input_r, tc + vec2(0, 0));
|
||||
r += texture2D(sh_input_r, tc + vec2(offset.x, 0));
|
||||
r += texture2D(sh_input_r, tc + vec2(0, offset.y));
|
||||
r += texture2D(sh_input_r, tc + vec2(offset.x, offset.y));
|
||||
r /= 4.0f;
|
||||
|
||||
g += texture2D(sh_input_g, tc + vec2(0, 0));
|
||||
g += texture2D(sh_input_g, tc + vec2(offset.x, 0));
|
||||
g += texture2D(sh_input_g, tc + vec2(0, offset.y));
|
||||
g += texture2D(sh_input_g, tc + vec2(offset.x, offset.y));
|
||||
g /= 4.0f;
|
||||
|
||||
b += texture2D(sh_input_b, tc + vec2(0, 0));
|
||||
b += texture2D(sh_input_b, tc + vec2(offset.x, 0));
|
||||
b += texture2D(sh_input_b, tc + vec2(0, offset.y));
|
||||
b += texture2D(sh_input_b, tc + vec2(offset.x, offset.y));
|
||||
b /= 4.0f;
|
||||
|
||||
frag_data[0] = r;
|
||||
frag_data[1] = g;
|
||||
frag_data[2] = b;
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
/**
|
||||
* @file gatherSkyShV.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$
|
||||
*/
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
void main()
|
||||
{
|
||||
// pass through untransformed fullscreen pos
|
||||
float oo_divisor = screen_res.x / 64.0;
|
||||
vec3 pos = (position.xyz * oo_divisor) + vec3(oo_divisor - 1, oo_divisor - 1, 0);
|
||||
gl_Position = vec4(pos.xyz, 1.0);
|
||||
vary_frag = texcoord0 * oo_divisor;
|
||||
}
|
||||
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/genSkyShF.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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
|
||||
uniform sampler2D transmittance_texture;
|
||||
uniform sampler3D scattering_texture;
|
||||
uniform sampler3D single_mie_scattering_texture;
|
||||
uniform sampler2D irradiance_texture;
|
||||
|
||||
vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
|
||||
vec3 calcDirection(vec2 tc)
|
||||
{
|
||||
float phi = tc.y * 2.0 * 3.14159265;
|
||||
float cosTheta = sqrt(1.0 - tc.x);
|
||||
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
|
||||
return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
|
||||
}
|
||||
|
||||
// reverse mapping above to convert a hemisphere direction into phi/theta values
|
||||
void getPhiAndThetaFromDirection(vec3 dir, out float phi, out float theta)
|
||||
{
|
||||
float sin_theta;
|
||||
float cos_theta;
|
||||
cos_theta = dir.z;
|
||||
theta = acos(cos_theta);
|
||||
sin_theta = sin(theta);
|
||||
phi = abs(sin_theta) > 0.0001 ? acos(dir.x / sin_theta) : 1.0;
|
||||
}
|
||||
|
||||
// reverse mapping above to convert a hemisphere direction into an SH texture sample pos
|
||||
vec2 calcShUvFromDirection(vec3 dir)
|
||||
{
|
||||
vec2 uv;
|
||||
float phi;
|
||||
float theta;
|
||||
getPhiAndThetaFromDirection(dir, phi, theta);
|
||||
uv.y = phi / 2.0 * 3.14159265;
|
||||
uv.x = theta / 2.0 * 3.14159265;
|
||||
return uv;
|
||||
}
|
||||
|
||||
void projectToL1(vec3 n, vec3 c, vec4 basis, out vec4 coeffs[3])
|
||||
{
|
||||
coeffs[0] = vec4(basis.x, n * basis.yzw * c.r);
|
||||
coeffs[1] = vec4(basis.x, n * basis.yzw * c.g);
|
||||
coeffs[2] = vec4(basis.x, n * basis.yzw * c.b);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
float Y00 = sqrt(1.0 / 3.14159265) * 0.5;
|
||||
float Y1x = sqrt(3.0 / 3.14159265) * 0.5;
|
||||
float Y1y = Y1x;
|
||||
float Y1z = Y1x;
|
||||
|
||||
vec4 L1 = vec4(Y00, Y1x, Y1y, Y1z);
|
||||
|
||||
vec3 view_direction = calcDirection(vary_frag);
|
||||
vec3 sun_direction = normalize(sun_dir);
|
||||
vec3 cam_pos = vec3(0, 0, 6360);
|
||||
|
||||
vec3 transmittance;
|
||||
vec3 radiance = GetSkyLuminance(cam_pos, view_direction, 0.0f, sun_direction, transmittance);
|
||||
|
||||
vec3 color = vec3(1.0) - exp(-radiance * 0.0001);
|
||||
|
||||
color = pow(color, vec3(1.0/2.2));
|
||||
|
||||
vec4 coeffs[3];
|
||||
coeffs[0] = vec4(0);
|
||||
coeffs[1] = vec4(0);
|
||||
coeffs[2] = vec4(0);
|
||||
|
||||
projectToL1(view_direction, color.rgb, L1, coeffs);
|
||||
|
||||
frag_data[0] = coeffs[0];
|
||||
frag_data[1] = coeffs[1];
|
||||
frag_data[2] = coeffs[2];
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* @file genSkyShV.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$
|
||||
*/
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
|
||||
void main()
|
||||
{
|
||||
// pass through untransformed fullscreen pos
|
||||
gl_Position = vec4(position.xyz, 1.0);
|
||||
vary_frag = texcoord0;
|
||||
}
|
||||
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/indirect.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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
uniform sampler2D sh_input_r;
|
||||
uniform sampler2D sh_input_g;
|
||||
uniform sampler2D sh_input_b;
|
||||
|
||||
vec3 GetIndirect(vec3 norm)
|
||||
{
|
||||
vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
|
||||
vec4 l1r = texture2D(sh_input_r, vec2(0,0));
|
||||
vec4 l1g = texture2D(sh_input_g, vec2(0,0));
|
||||
vec4 l1b = texture2D(sh_input_b, vec2(0,0));
|
||||
vec3 indirect = vec3(dot(l1r, l1tap * vec4(1, norm.xyz)),
|
||||
dot(l1g, l1tap * vec4(1, norm.xyz)),
|
||||
dot(l1b, l1tap * vec4(1, norm.xyz)));
|
||||
indirect = clamp(indirect, vec3(0), vec3(1.0));
|
||||
return indirect;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,455 @@
|
|||
/**
|
||||
* @file materialF.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]*/
|
||||
|
||||
//class1/deferred/materialF.glsl
|
||||
|
||||
// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
|
||||
|
||||
#define DIFFUSE_ALPHA_MODE_NONE 0
|
||||
#define DIFFUSE_ALPHA_MODE_BLEND 1
|
||||
#define DIFFUSE_ALPHA_MODE_MASK 2
|
||||
#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
|
||||
|
||||
uniform float emissive_brightness; // fullbright flag, 1.0 == fullbright, 0.0 otherwise
|
||||
uniform int sun_up_factor;
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 applyWaterFogView(vec3 pos, vec4 color);
|
||||
#endif
|
||||
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs);
|
||||
vec3 linear_to_srgb(vec3 cs);
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
#endif
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
// Inputs
|
||||
uniform vec4 morphFactor;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform mat3 env_mat;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
VARYING vec3 vary_position;
|
||||
|
||||
uniform mat4 proj_mat;
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec4 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
float getAmbientClamp();
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
|
||||
{
|
||||
// SL-14895 inverted attenuation work-around
|
||||
// This routine is tweaked to match deferred lighting, but previously used an inverted la value. To reconstruct
|
||||
// that previous value now that the inversion is corrected, we reverse the calculations in LLPipeline::setupHWLights()
|
||||
// to recover the `adjusted_radius` value previously being sent as la.
|
||||
float falloff_factor = (12.0 * fa) - 9.0;
|
||||
float inverted_la = falloff_factor / la;
|
||||
// Yes, it makes me want to cry as well. DJH
|
||||
|
||||
vec3 col = vec3(0);
|
||||
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz - v;
|
||||
|
||||
//get distance
|
||||
float dist = length(lv);
|
||||
float da = 1.0;
|
||||
|
||||
dist /= inverted_la;
|
||||
|
||||
if (dist > 0.0 && inverted_la > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv = normalize(lv);
|
||||
|
||||
//distance attenuation
|
||||
float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0f;
|
||||
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
return col;
|
||||
}
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= dot(n, lv);
|
||||
|
||||
float lit = 0.0f;
|
||||
|
||||
float amb_da = ambiance;
|
||||
if (da >= 0)
|
||||
{
|
||||
lit = max(da * dist_atten, 0.0);
|
||||
col = lit * light_col * diffuse;
|
||||
amb_da += (da*0.5 + 0.5) * ambiance;
|
||||
}
|
||||
amb_da += (da*da*0.5 + 0.5) * ambiance;
|
||||
amb_da *= dist_atten;
|
||||
amb_da = min(amb_da, 1.0f - lit);
|
||||
|
||||
// SL-10969 need to see why these are blown out
|
||||
//col.rgb += amb_da * light_col * diffuse;
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv + npos);
|
||||
float nh = dot(n, h);
|
||||
float nv = dot(n, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
|
||||
speccol = clamp(speccol, vec3(0), vec3(1));
|
||||
col += speccol;
|
||||
|
||||
float cur_glare = max(speccol.r, speccol.g);
|
||||
cur_glare = max(cur_glare, speccol.b);
|
||||
glare = max(glare, speccol.r);
|
||||
glare += max(cur_glare, 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return max(col, vec3(0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
#else
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
uniform sampler2D bumpMap;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
uniform sampler2D specularMap;
|
||||
|
||||
VARYING vec2 vary_texcoord2;
|
||||
#endif
|
||||
|
||||
uniform float env_intensity;
|
||||
uniform vec4 specular_color; // specular color RGB and specular exponent (glossiness) in alpha
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
uniform float minimum_alpha;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
VARYING vec3 vary_mat0;
|
||||
VARYING vec3 vary_mat1;
|
||||
VARYING vec3 vary_mat2;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
#else
|
||||
VARYING vec3 vary_normal;
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pos_screen = vary_texcoord0.xy;
|
||||
|
||||
vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
diffcol.rgb *= vertex_color.rgb;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
|
||||
// Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
|
||||
float bias = 0.001953125; // 1/512, or half an 8-bit quantization
|
||||
if (diffcol.a < minimum_alpha-bias)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
vec3 gamma_diff = diffcol.rgb;
|
||||
diffcol.rgb = srgb_to_linear(diffcol.rgb);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
|
||||
spec.rgb *= specular_color.rgb;
|
||||
#else
|
||||
vec4 spec = vec4(specular_color.rgb, 1.0);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
|
||||
|
||||
norm.xyz = norm.xyz * 2 - 1;
|
||||
|
||||
vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
|
||||
dot(norm.xyz,vary_mat1),
|
||||
dot(norm.xyz,vary_mat2));
|
||||
#else
|
||||
vec4 norm = vec4(0,0,0,1.0);
|
||||
vec3 tnorm = vary_normal;
|
||||
#endif
|
||||
|
||||
norm.xyz = normalize(tnorm.xyz);
|
||||
|
||||
vec2 abnormal = encode_normal(norm.xyz);
|
||||
|
||||
vec4 final_color = diffcol;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
|
||||
final_color.a = emissive_brightness;
|
||||
#else
|
||||
final_color.a = max(final_color.a, emissive_brightness);
|
||||
#endif
|
||||
|
||||
vec4 final_specular = spec;
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
|
||||
final_specular.a = specular_color.a * norm.a;
|
||||
#else
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
|
||||
final_specular.a = specular_color.a;
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
//forward rendering, output just lit sRGBA
|
||||
vec3 pos = vary_position;
|
||||
|
||||
float shadow = 1.0f;
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
|
||||
#endif
|
||||
|
||||
spec = final_specular;
|
||||
vec4 diffuse = final_color;
|
||||
float envIntensity = final_normal.z;
|
||||
|
||||
vec3 color = vec3(0,0,0);
|
||||
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
|
||||
float bloom = 0.0;
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
// This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
|
||||
// The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
|
||||
// TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
|
||||
//color = fullbrightScaleSoftClip(color);
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
//we're in sRGB space, so gamma correct this dot product so
|
||||
// lighting from the sun stays sharp
|
||||
float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
|
||||
da = pow(da, 1.0 / 1.3);
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit;
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
|
||||
amblit = max(ambenv, amblit);
|
||||
color.rgb = amblit;
|
||||
#else
|
||||
|
||||
color = amblit;
|
||||
|
||||
//darken ambient for normals perpendicular to light vector so surfaces in shadow
|
||||
// and facing away from light still have some definition to them.
|
||||
// do NOT gamma correct this dot product so ambient lighting stays soft
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
|
||||
color *= ambient;
|
||||
#endif
|
||||
|
||||
color += sun_contrib;
|
||||
|
||||
color *= gamma_diff.rgb;
|
||||
|
||||
float glare = 0.0;
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
|
||||
glare = max(spec_contrib.r, spec_contrib.g);
|
||||
glare = max(glare, spec_contrib.b);
|
||||
|
||||
color += spec_contrib;
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
color = mix(color.rgb, diffcol.rgb, diffuse.a);
|
||||
|
||||
#ifdef HAS_REFLECTION_PROBES
|
||||
if (envIntensity > 0.0)
|
||||
{ // add environmentmap
|
||||
//fudge darker
|
||||
legacyenv *= 0.5*diffuse.a+0.5;
|
||||
|
||||
applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
|
||||
}
|
||||
#else
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
//add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
|
||||
color = mix(color, reflected_color, envIntensity);
|
||||
|
||||
float cur_glare = max(reflected_color.r, reflected_color.g);
|
||||
cur_glare = max(cur_glare, reflected_color.b);
|
||||
cur_glare *= envIntensity*4.0;
|
||||
glare += cur_glare;
|
||||
}
|
||||
#endif
|
||||
|
||||
color = atmosFragLighting(color, additive, atten);
|
||||
color = scaleSoftClipFrag(color);
|
||||
|
||||
//convert to linear before adding local lights
|
||||
color = srgb_to_linear(color);
|
||||
|
||||
vec3 npos = normalize(-pos.xyz);
|
||||
|
||||
vec3 light = vec3(0, 0, 0);
|
||||
|
||||
final_specular.rgb = srgb_to_linear(final_specular.rgb); // SL-14035
|
||||
|
||||
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
|
||||
|
||||
LIGHT_LOOP(1)
|
||||
LIGHT_LOOP(2)
|
||||
LIGHT_LOOP(3)
|
||||
LIGHT_LOOP(4)
|
||||
LIGHT_LOOP(5)
|
||||
LIGHT_LOOP(6)
|
||||
LIGHT_LOOP(7)
|
||||
|
||||
color += light;
|
||||
|
||||
glare = min(glare, 1.0);
|
||||
float al = max(diffcol.a, glare)*vertex_color.a;
|
||||
|
||||
//convert to srgb as this color is being written post gamma correction
|
||||
color = linear_to_srgb(color);
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 temp = applyWaterFogView(pos, vec4(color, al));
|
||||
color = temp.rgb;
|
||||
al = temp.a;
|
||||
#endif
|
||||
|
||||
frag_color = vec4(color, al);
|
||||
|
||||
#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer
|
||||
|
||||
// deferred path
|
||||
frag_data[0] = final_color; //gbuffer is sRGB
|
||||
frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
|
||||
frag_data[2] = final_normal; // XY = Normal. Z = Env. intensity.
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1,291 +0,0 @@
|
|||
/**
|
||||
* @file multiSpotLightF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
#extension GL_ARB_shader_texture_lod : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2DRect diffuseRect;
|
||||
uniform sampler2DRect specularRect;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2DRect normalMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2DRect lightMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D projectionMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform mat4 proj_mat; //screen space to light space
|
||||
uniform float proj_near; //near clip for projection
|
||||
uniform vec3 proj_p; //plane projection is emitting from (in screen space)
|
||||
uniform vec3 proj_n;
|
||||
uniform float proj_focus; //distance from plane to begin blurring
|
||||
uniform float proj_lod; //(number of mips in proj map)
|
||||
uniform float proj_range; //range between near clip and far clip plane of projection
|
||||
uniform float proj_ambient_lod;
|
||||
uniform float proj_ambiance;
|
||||
uniform float near_clip;
|
||||
uniform float far_clip;
|
||||
|
||||
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
|
||||
uniform float sun_wash;
|
||||
uniform int proj_shadow_idx;
|
||||
uniform float shadow_fade;
|
||||
|
||||
uniform vec3 center;
|
||||
uniform float size;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
|
||||
VARYING vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
|
||||
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
|
||||
|
||||
float det = min(lod/(proj_lod*0.5), 1.0);
|
||||
|
||||
float d = min(dist.x, dist.y);
|
||||
|
||||
d *= min(1, d * (proj_lod - lod));
|
||||
|
||||
float edge = 0.25*det;
|
||||
|
||||
ret *= clamp(d/edge, 0.0, 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
|
||||
|
||||
float det = min(lod/(proj_lod*0.5), 1.0);
|
||||
|
||||
float d = min(dist.x, dist.y);
|
||||
|
||||
float edge = 0.25*det;
|
||||
|
||||
ret *= clamp(d/edge, 0.0, 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = tc-vec2(0.5);
|
||||
|
||||
float d = dot(dist,dist);
|
||||
|
||||
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 frag = vary_fragcoord;
|
||||
frag.xyz /= frag.w;
|
||||
frag.xyz = frag.xyz*0.5+0.5;
|
||||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = center.xyz-pos.xyz;
|
||||
float dist = length(lv);
|
||||
dist /= size;
|
||||
if (dist > 1.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
float shadow = 1.0;
|
||||
|
||||
if (proj_shadow_idx >= 0)
|
||||
{
|
||||
vec4 shd = texture2DRect(lightMap, frag.xy);
|
||||
shadow = (proj_shadow_idx == 0) ? shd.b : shd.a;
|
||||
shadow += shadow_fade;
|
||||
shadow = clamp(shadow, 0.0, 1.0);
|
||||
}
|
||||
|
||||
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
|
||||
|
||||
float envIntensity = norm.z;
|
||||
|
||||
norm = getNorm(frag.xy);
|
||||
|
||||
norm = normalize(norm);
|
||||
float l_dist = -dot(lv, proj_n);
|
||||
|
||||
vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
|
||||
if (proj_tc.z < 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
proj_tc.xyz /= proj_tc.w;
|
||||
|
||||
float fa = (falloff*0.5)+1.0;
|
||||
float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0;
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
lv = proj_origin-pos.xyz;
|
||||
lv = normalize(lv);
|
||||
float da = dot(norm, lv);
|
||||
|
||||
vec3 col = vec3(0,0,0);
|
||||
|
||||
vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, frag.xy);
|
||||
|
||||
vec3 dlit = vec3(0, 0, 0);
|
||||
|
||||
float noise = texture2D(noiseMap, frag.xy/128.0).b;
|
||||
if (proj_tc.z > 0.0 &&
|
||||
proj_tc.x < 1.0 &&
|
||||
proj_tc.y < 1.0 &&
|
||||
proj_tc.x > 0.0 &&
|
||||
proj_tc.y > 0.0)
|
||||
{
|
||||
float amb_da = proj_ambiance;
|
||||
float lit = 0.0;
|
||||
|
||||
if (da > 0.0)
|
||||
{
|
||||
lit = da * dist_atten * noise;
|
||||
|
||||
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
dlit = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
col = dlit*lit*diff_tex*shadow;
|
||||
amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
|
||||
}
|
||||
|
||||
//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
|
||||
vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
|
||||
|
||||
amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance;
|
||||
|
||||
amb_da *= dist_atten * noise;
|
||||
|
||||
amb_da = min(amb_da, 1.0-lit);
|
||||
|
||||
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
vec3 npos = -normalize(pos);
|
||||
dlit *= min(da*6.0, 1.0) * dist_atten;
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv+npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
col += dlit*scol*spec.rgb*shadow;
|
||||
//col += spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
vec3 ref = reflect(normalize(pos), norm);
|
||||
|
||||
//project from point pos in direction ref to plane proj_p, proj_n
|
||||
vec3 pdelta = proj_p-pos;
|
||||
float ds = dot(ref, proj_n);
|
||||
|
||||
if (ds < 0.0)
|
||||
{
|
||||
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
|
||||
|
||||
vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
|
||||
|
||||
if (stc.z > 0.0)
|
||||
{
|
||||
stc /= stc.w;
|
||||
|
||||
if (stc.x < 1.0 &&
|
||||
stc.y < 1.0 &&
|
||||
stc.x > 0.0 &&
|
||||
stc.y > 0.0)
|
||||
{
|
||||
col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//not sure why, but this line prevents MATBUG-194
|
||||
col = max(col, vec3(0.0));
|
||||
|
||||
col = scaleDownLight(col);
|
||||
|
||||
//output linear space color as gamma correction happens down stream
|
||||
frag_color.rgb = col;
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* @file pointShadowBlur.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 samplerCube cube_map;
|
||||
|
||||
in vec3 to_vec;
|
||||
|
||||
out vec4 fragColor;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 vcol = texture(cube_map, to_vec);
|
||||
fragColor = vec4(vcol.rgb, 1.0);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,476 @@
|
|||
/**
|
||||
* @file class2/deferred/reflectionProbeF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_shader_texture_lod : enable
|
||||
|
||||
#define FLT_MAX 3.402823466e+38
|
||||
|
||||
#define REFMAP_COUNT 256
|
||||
#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
|
||||
|
||||
uniform samplerCubeArray reflectionProbes;
|
||||
|
||||
layout (std140, binding = 1) uniform ReflectionProbes
|
||||
{
|
||||
// list of OBBs for user override probes
|
||||
// box is a set of 3 planes outward facing planes and the depth of the box along that plane
|
||||
// for each box refBox[i]...
|
||||
/// box[0..2] - plane 0 .. 2 in [A,B,C,D] notation
|
||||
// box[3][0..2] - plane thickness
|
||||
mat4 refBox[REFMAP_COUNT];
|
||||
// list of bounding spheres for reflection probes sorted by distance to camera (closest first)
|
||||
vec4 refSphere[REFMAP_COUNT];
|
||||
// index of cube map in reflectionProbes for a corresponding reflection probe
|
||||
// e.g. cube map channel of refSphere[2] is stored in refIndex[2]
|
||||
// refIndex.x - cubemap channel in reflectionProbes
|
||||
// refIndex.y - index in refNeighbor of neighbor list (index is ivec4 index, not int index)
|
||||
// refIndex.z - number of neighbors
|
||||
// refIndex.w - priority, if negative, this probe has a box influence
|
||||
ivec4 refIndex[REFMAP_COUNT];
|
||||
|
||||
// neighbor list data (refSphere indices, not cubemap array layer)
|
||||
ivec4 refNeighbor[1024];
|
||||
|
||||
// number of reflection probes present in refSphere
|
||||
int refmapCount;
|
||||
|
||||
// intensity of ambient light from reflection probes
|
||||
float reflectionAmbiance;
|
||||
};
|
||||
|
||||
// Inputs
|
||||
uniform mat3 env_mat;
|
||||
|
||||
// list of probeIndexes shader will actually use after "getRefIndex" is called
|
||||
// (stores refIndex/refSphere indices, NOT rerflectionProbes layer)
|
||||
int probeIndex[REF_SAMPLE_COUNT];
|
||||
|
||||
// number of probes stored in probeIndex
|
||||
int probeInfluences = 0;
|
||||
|
||||
bool isAbove(vec3 pos, vec4 plane)
|
||||
{
|
||||
return (dot(plane.xyz, pos) + plane.w) > 0;
|
||||
}
|
||||
|
||||
// return true if probe at index i influences position pos
|
||||
bool shouldSampleProbe(int i, vec3 pos)
|
||||
{
|
||||
if (refIndex[i].w < 0)
|
||||
{
|
||||
vec4 v = refBox[i] * vec4(pos, 1.0);
|
||||
if (abs(v.x) > 1 ||
|
||||
abs(v.y) > 1 ||
|
||||
abs(v.z) > 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vec3 delta = pos.xyz - refSphere[i].xyz;
|
||||
float d = dot(delta, delta);
|
||||
float r2 = refSphere[i].w;
|
||||
r2 *= r2;
|
||||
|
||||
if (d > r2)
|
||||
{ //outside bounding sphere
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// call before sampleRef
|
||||
// populate "probeIndex" with N probe indices that influence pos where N is REF_SAMPLE_COUNT
|
||||
// overall algorithm --
|
||||
void preProbeSample(vec3 pos)
|
||||
{
|
||||
// TODO: make some sort of structure that reduces the number of distance checks
|
||||
|
||||
for (int i = 0; i < refmapCount; ++i)
|
||||
{
|
||||
// found an influencing probe
|
||||
if (shouldSampleProbe(i, pos))
|
||||
{
|
||||
probeIndex[probeInfluences] = i;
|
||||
++probeInfluences;
|
||||
|
||||
int neighborIdx = refIndex[i].y;
|
||||
if (neighborIdx != -1)
|
||||
{
|
||||
int neighborCount = min(refIndex[i].z, REF_SAMPLE_COUNT-1);
|
||||
|
||||
int count = 0;
|
||||
while (count < neighborCount)
|
||||
{
|
||||
// check up to REF_SAMPLE_COUNT-1 neighbors (neighborIdx is ivec4 index)
|
||||
|
||||
int idx = refNeighbor[neighborIdx].x;
|
||||
if (shouldSampleProbe(idx, pos))
|
||||
{
|
||||
probeIndex[probeInfluences++] = idx;
|
||||
if (probeInfluences == REF_SAMPLE_COUNT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
if (count == neighborCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
idx = refNeighbor[neighborIdx].y;
|
||||
if (shouldSampleProbe(idx, pos))
|
||||
{
|
||||
probeIndex[probeInfluences++] = idx;
|
||||
if (probeInfluences == REF_SAMPLE_COUNT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
if (count == neighborCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
idx = refNeighbor[neighborIdx].z;
|
||||
if (shouldSampleProbe(idx, pos))
|
||||
{
|
||||
probeIndex[probeInfluences++] = idx;
|
||||
if (probeInfluences == REF_SAMPLE_COUNT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
if (count == neighborCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
idx = refNeighbor[neighborIdx].w;
|
||||
if (shouldSampleProbe(idx, pos))
|
||||
{
|
||||
probeIndex[probeInfluences++] = idx;
|
||||
if (probeInfluences == REF_SAMPLE_COUNT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
if (count == neighborCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
++neighborIdx;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// from https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection
|
||||
|
||||
// original reference implementation:
|
||||
/*
|
||||
bool intersect(const Ray &ray) const
|
||||
{
|
||||
float t0, t1; // solutions for t if the ray intersects
|
||||
#if 0
|
||||
// geometric solution
|
||||
Vec3f L = center - orig;
|
||||
float tca = L.dotProduct(dir);
|
||||
// if (tca < 0) return false;
|
||||
float d2 = L.dotProduct(L) - tca * tca;
|
||||
if (d2 > radius2) return false;
|
||||
float thc = sqrt(radius2 - d2);
|
||||
t0 = tca - thc;
|
||||
t1 = tca + thc;
|
||||
#else
|
||||
// analytic solution
|
||||
Vec3f L = orig - center;
|
||||
float a = dir.dotProduct(dir);
|
||||
float b = 2 * dir.dotProduct(L);
|
||||
float c = L.dotProduct(L) - radius2;
|
||||
if (!solveQuadratic(a, b, c, t0, t1)) return false;
|
||||
#endif
|
||||
if (t0 > t1) std::swap(t0, t1);
|
||||
|
||||
if (t0 < 0) {
|
||||
t0 = t1; // if t0 is negative, let's use t1 instead
|
||||
if (t0 < 0) return false; // both t0 and t1 are negative
|
||||
}
|
||||
|
||||
t = t0;
|
||||
|
||||
return true;
|
||||
} */
|
||||
|
||||
// adapted -- assume that origin is inside sphere, return distance from origin to edge of sphere
|
||||
vec3 sphereIntersect(vec3 origin, vec3 dir, vec3 center, float radius2)
|
||||
{
|
||||
float t0, t1; // solutions for t if the ray intersects
|
||||
|
||||
vec3 L = center - origin;
|
||||
float tca = dot(L,dir);
|
||||
|
||||
float d2 = dot(L,L) - tca * tca;
|
||||
|
||||
float thc = sqrt(radius2 - d2);
|
||||
t0 = tca - thc;
|
||||
t1 = tca + thc;
|
||||
|
||||
vec3 v = origin + dir * t1;
|
||||
return v;
|
||||
}
|
||||
|
||||
// from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
|
||||
/*
|
||||
vec3 DirectionWS = normalize(PositionWS - CameraWS);
|
||||
vec3 ReflDirectionWS = reflect(DirectionWS, NormalWS);
|
||||
|
||||
// Intersection with OBB convertto unit box space
|
||||
// Transform in local unit parallax cube space (scaled and rotated)
|
||||
vec3 RayLS = MulMatrix( float(3x3)WorldToLocal, ReflDirectionWS);
|
||||
vec3 PositionLS = MulMatrix( WorldToLocal, PositionWS);
|
||||
|
||||
vec3 Unitary = vec3(1.0f, 1.0f, 1.0f);
|
||||
vec3 FirstPlaneIntersect = (Unitary - PositionLS) / RayLS;
|
||||
vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;
|
||||
vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
|
||||
float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z));
|
||||
|
||||
// Use Distance in WS directly to recover intersection
|
||||
vec3 IntersectPositionWS = PositionWS + ReflDirectionWS * Distance;
|
||||
vec3 ReflDirectionWS = IntersectPositionWS - CubemapPositionWS;
|
||||
|
||||
return texCUBE(envMap, ReflDirectionWS);
|
||||
*/
|
||||
|
||||
// get point of intersection with given probe's box influence volume
|
||||
// origin - ray origin in clip space
|
||||
// dir - ray direction in clip space
|
||||
// i - probe index in refBox/refSphere
|
||||
vec3 boxIntersect(vec3 origin, vec3 dir, int i)
|
||||
{
|
||||
// Intersection with OBB convertto unit box space
|
||||
// Transform in local unit parallax cube space (scaled and rotated)
|
||||
mat4 clipToLocal = refBox[i];
|
||||
|
||||
vec3 RayLS = mat3(clipToLocal) * dir;
|
||||
vec3 PositionLS = (clipToLocal * vec4(origin, 1.0)).xyz;
|
||||
|
||||
vec3 Unitary = vec3(1.0f, 1.0f, 1.0f);
|
||||
vec3 FirstPlaneIntersect = (Unitary - PositionLS) / RayLS;
|
||||
vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;
|
||||
vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
|
||||
float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z));
|
||||
|
||||
// Use Distance in CS directly to recover intersection
|
||||
vec3 IntersectPositionCS = origin + dir * Distance;
|
||||
|
||||
return IntersectPositionCS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Tap a sphere based reflection probe
|
||||
// pos - position of pixel
|
||||
// dir - pixel normal
|
||||
// lod - which mip to bias towards (lower is higher res, sharper reflections)
|
||||
// c - center of probe
|
||||
// r2 - radius of probe squared
|
||||
// i - index of probe
|
||||
// vi - point at which reflection vector struck the influence volume, in clip space
|
||||
vec3 tapRefMap(vec3 pos, vec3 dir, float lod, vec3 c, float r2, int i)
|
||||
{
|
||||
//lod = max(lod, 1);
|
||||
// parallax adjustment
|
||||
|
||||
vec3 v;
|
||||
if (refIndex[i].w < 0)
|
||||
{
|
||||
v = boxIntersect(pos, dir, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
v = sphereIntersect(pos, dir, c, r2);
|
||||
}
|
||||
|
||||
v -= c;
|
||||
v = env_mat * v;
|
||||
{
|
||||
float min_lod = textureQueryLod(reflectionProbes,v).y; // lower is higher res
|
||||
return textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), max(min_lod, lod)).rgb;
|
||||
//return texture(reflectionProbes, vec4(v.xyz, refIndex[i].x)).rgb;
|
||||
}
|
||||
}
|
||||
|
||||
vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
|
||||
{
|
||||
float wsum = 0.0;
|
||||
vec3 col = vec3(0,0,0);
|
||||
float vd2 = dot(pos,pos); // view distance squared
|
||||
|
||||
for (int idx = 0; idx < probeInfluences; ++idx)
|
||||
{
|
||||
int i = probeIndex[idx];
|
||||
float r = refSphere[i].w; // radius of sphere volume
|
||||
float p = float(abs(refIndex[i].w)); // priority
|
||||
float rr = r*r; // radius squred
|
||||
float r1 = r * 0.1; // 75% of radius (outer sphere to start interpolating down)
|
||||
vec3 delta = pos.xyz-refSphere[i].xyz;
|
||||
float d2 = dot(delta,delta);
|
||||
float r2 = r1*r1;
|
||||
|
||||
{
|
||||
vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, rr, i);
|
||||
|
||||
float w = 1.0/d2;
|
||||
|
||||
float atten = 1.0-max(d2-r2, 0.0)/(rr-r2);
|
||||
w *= atten;
|
||||
w *= p; // boost weight based on priority
|
||||
col += refcol*w;
|
||||
|
||||
wsum += w;
|
||||
}
|
||||
}
|
||||
|
||||
if (probeInfluences <= 1)
|
||||
{ //edge-of-scene probe or no probe influence, mix in with embiggened version of probes closest to camera
|
||||
for (int idx = 0; idx < 8; ++idx)
|
||||
{
|
||||
if (refIndex[idx].w < 0)
|
||||
{ // don't fallback to box probes, they are *very* specific
|
||||
continue;
|
||||
}
|
||||
int i = idx;
|
||||
vec3 delta = pos.xyz-refSphere[i].xyz;
|
||||
float d2 = dot(delta,delta);
|
||||
|
||||
{
|
||||
vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, d2, i);
|
||||
|
||||
float w = 1.0/d2;
|
||||
w *= w;
|
||||
col += refcol*w;
|
||||
wsum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wsum > 0.0)
|
||||
{
|
||||
col *= 1.0/wsum;
|
||||
}
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 sampleProbeAmbient(vec3 pos, vec3 dir, float lod)
|
||||
{
|
||||
vec3 col = sampleProbes(pos, dir, lod);
|
||||
|
||||
//desaturate
|
||||
vec3 hcol = col *0.5;
|
||||
|
||||
col *= 2.0;
|
||||
col = vec3(
|
||||
col.r + hcol.g + hcol.b,
|
||||
col.g + hcol.r + hcol.b,
|
||||
col.b + hcol.r + hcol.g
|
||||
);
|
||||
|
||||
col *= 0.333333;
|
||||
|
||||
return col*reflectionAmbiance;
|
||||
|
||||
}
|
||||
|
||||
// brighten a color so that at least one component is 1
|
||||
vec3 brighten(vec3 c)
|
||||
{
|
||||
float m = max(max(c.r, c.g), c.b);
|
||||
|
||||
if (m == 0)
|
||||
{
|
||||
return vec3(1,1,1);
|
||||
}
|
||||
|
||||
return c * 1.0/m;
|
||||
}
|
||||
|
||||
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity)
|
||||
{
|
||||
// TODO - don't hard code lods
|
||||
float reflection_lods = 8;
|
||||
preProbeSample(pos);
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
|
||||
ambenv = sampleProbeAmbient(pos, norm, reflection_lods-1);
|
||||
|
||||
if (glossiness > 0.0)
|
||||
{
|
||||
float lod = (1.0-glossiness)*reflection_lods;
|
||||
glossenv = sampleProbes(pos, normalize(refnormpersp), lod);
|
||||
}
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm)
|
||||
{
|
||||
glossenv *= 0.35; // fudge darker
|
||||
float fresnel = 1.0+dot(normalize(pos.xyz), norm.xyz);
|
||||
float minf = spec.a * 0.1;
|
||||
fresnel = fresnel * (1.0-minf) + minf;
|
||||
glossenv *= spec.rgb*min(fresnel, 1.0);
|
||||
color.rgb += glossenv;
|
||||
}
|
||||
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity)
|
||||
{
|
||||
vec3 reflected_color = legacyenv; //*0.5; //fudge darker
|
||||
vec3 lookAt = normalize(pos);
|
||||
float fresnel = 1.0+dot(lookAt, norm.xyz);
|
||||
fresnel *= fresnel;
|
||||
fresnel = min(fresnel+envIntensity, 1.0);
|
||||
reflected_color *= (envIntensity*fresnel)*brighten(spec.rgb);
|
||||
color = mix(color.rgb, reflected_color, envIntensity);
|
||||
}
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shVisF.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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Fragment shader for L1 SH debug rendering
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
uniform sampler2D sh_input_r;
|
||||
uniform sampler2D sh_input_g;
|
||||
uniform sampler2D sh_input_b;
|
||||
|
||||
uniform mat3 inv_modelviewprojection;
|
||||
|
||||
VARYING vec4 vary_pos;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec2 coord = vary_pos.xy + vec2(0.5,0.5);
|
||||
|
||||
coord.x *= (1.6/0.9);
|
||||
|
||||
if (dot(coord, coord) > 0.25)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 n = vec4(coord*2.0, 0.0, 1);
|
||||
//n.y = -n.y;
|
||||
n.z = sqrt(max(1.0-n.x*n.x-n.y*n.y, 0.0));
|
||||
//n.xyz = inv_modelviewprojection * n.xyz;
|
||||
|
||||
vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
|
||||
vec4 l1r = texture2D(sh_input_r, vec2(0,0));
|
||||
vec4 l1g = texture2D(sh_input_g, vec2(0,0));
|
||||
vec4 l1b = texture2D(sh_input_b, vec2(0,0));
|
||||
vec3 indirect = vec3(
|
||||
dot(l1r, l1tap * n),
|
||||
dot(l1g, l1tap * n),
|
||||
dot(l1b, l1tap * n));
|
||||
|
||||
//indirect = pow(indirect, vec3(0.45));
|
||||
indirect *= 3.0;
|
||||
|
||||
frag_color = vec4(indirect, 1.0);
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shVisV.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$
|
||||
*/
|
||||
ATTRIBUTE vec3 position;
|
||||
VARYING vec4 vary_pos;
|
||||
|
||||
void main()
|
||||
{
|
||||
// Output
|
||||
vary_pos = vec4(position, 1);
|
||||
gl_Position = vary_pos;
|
||||
}
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
/**
|
||||
* @file shadowAlphaMaskF.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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING float pos_w;
|
||||
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec3 pos;
|
||||
|
||||
vec4 computeMoments(float depth, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
|
||||
|
||||
frag_color = computeMoments(length(pos), float a);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0);
|
||||
#endif
|
||||
}
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/**
|
||||
* @file shadowAlphaMaskV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform float shadow_target_width;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 pos;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
vec4 pos = modelview_projection_matrix * pre_pos;
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
pos_w = pos.w;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
pos_zd2 = pos.z * 0.5;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
|
||||
passTextureIndex();
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowAlphaMaskF.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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING float pos_w;
|
||||
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec4 getPosition(vec2 screen_coord);
|
||||
vec4 computeMoments(float depth, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 pos = getPosition(vary_texcoord0.xy);
|
||||
|
||||
float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
|
||||
|
||||
if (alpha < 0.05) // treat as totally transparent
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
if (alpha < 0.88) // treat as semi-transparent
|
||||
{
|
||||
if (fract(0.5*floor(target_pos_x / pos_w )) < 0.25)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
}
|
||||
|
||||
frag_color = computeMoments(length(pos.xyz), alpha);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowAlphaMaskV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform float shadow_target_width;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
|
||||
pos = modelview_projection_matrix * pre_pos;
|
||||
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
pos_zd2 = pos.z * 0.5;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
|
||||
passTextureIndex();
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowCubeV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
uniform vec3 box_center;
|
||||
uniform vec3 box_size;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec3 p = position*box_size+box_center;
|
||||
vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
post_pos = pos;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowF.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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING float target_pos_x;
|
||||
|
||||
vec4 computeMoments(float depth, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
frag_color = computeMoments(length(pos), 1.0);
|
||||
}
|
||||
|
||||
|
|
@ -1,157 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowUtil.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 sampler2D shadowMap0;
|
||||
uniform sampler2D shadowMap1;
|
||||
uniform sampler2D shadowMap2;
|
||||
uniform sampler2D shadowMap3;
|
||||
uniform sampler2D shadowMap4;
|
||||
uniform sampler2D shadowMap5;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
uniform vec2 shadow_res;
|
||||
uniform vec2 proj_shadow_res;
|
||||
uniform mat4 shadow_matrix[6];
|
||||
uniform vec4 shadow_clip;
|
||||
uniform float shadow_bias;
|
||||
|
||||
uniform float spot_shadow_bias;
|
||||
uniform float spot_shadow_offset;
|
||||
|
||||
float getDepth(vec2 screenpos);
|
||||
vec3 getNorm(vec2 screenpos);
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
|
||||
float ReduceLightBleeding(float p_max, float Amount)
|
||||
{
|
||||
return smoothstep(Amount, 1, p_max);
|
||||
}
|
||||
|
||||
float ChebyshevUpperBound(vec2 m, float t, float min_v, float Amount)
|
||||
{
|
||||
float p = (t <= m.x) ? 1.0 : 0.0;
|
||||
|
||||
float v = m.y - (m.x*m.x);
|
||||
v = max(v, min_v);
|
||||
|
||||
float d = t - m.x;
|
||||
|
||||
float p_max = v / (v + d*d);
|
||||
|
||||
p_max = ReduceLightBleeding(p_max, Amount);
|
||||
|
||||
return max(p, p_max);
|
||||
}
|
||||
|
||||
vec4 computeMoments(float depth, float a)
|
||||
{
|
||||
float m1 = depth;
|
||||
float dx = dFdx(depth);
|
||||
float dy = dFdy(depth);
|
||||
float m2 = m1*m1 + 0.25 * a * (dx*dx + dy*dy);
|
||||
return vec4(m1, m2, a, max(dx, dy));
|
||||
}
|
||||
|
||||
float vsmDirectionalSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix)
|
||||
{
|
||||
vec4 lpos = shadowMatrix * stc;
|
||||
vec4 moments = texture2D(shadowMap, lpos.xy);
|
||||
return ChebyshevUpperBound(moments.rg, depth - shadow_bias * 256.0f, 0.125, 0.9);
|
||||
}
|
||||
|
||||
float vsmSpotSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix)
|
||||
{
|
||||
vec4 lpos = shadowMatrix * stc;
|
||||
vec4 moments = texture2D(shadowMap, lpos.xy);
|
||||
lpos.xyz /= lpos.w;
|
||||
lpos.xy *= 0.5;
|
||||
lpos.xy += 0.5;
|
||||
return ChebyshevUpperBound(moments.rg, depth - spot_shadow_bias * 16.0f, 0.125, 0.9);
|
||||
}
|
||||
|
||||
#if VSM_POINT_SHADOWS
|
||||
float vsmPointSample(float lightDistance, vec3 lightDirection, samplerCube shadow_cube_map)
|
||||
{
|
||||
vec4 moments = textureCube(shadow_cube_map, light_direction);
|
||||
return ChebyshevUpperBound(moments.rg, light_distance, 0.01, 0.25);
|
||||
}
|
||||
#endif
|
||||
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
|
||||
{
|
||||
if (pos.z < -shadow_clip.w)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
float depth = getDepth(pos_screen);
|
||||
|
||||
vec4 spos = vec4(pos,1.0);
|
||||
vec4 near_split = shadow_clip*-0.75;
|
||||
vec4 far_split = shadow_clip*-1.25;
|
||||
|
||||
float shadow = 0.0f;
|
||||
float weight = 1.0;
|
||||
|
||||
if (spos.z < near_split.z)
|
||||
{
|
||||
shadow += vsmDirectionalSample(spos, depth, shadowMap3, shadow_matrix[3]);
|
||||
weight += 1.0f;
|
||||
}
|
||||
if (spos.z < near_split.y)
|
||||
{
|
||||
shadow += vsmDirectionalSample(spos, depth, shadowMap2, shadow_matrix[2]);
|
||||
weight += 1.0f;
|
||||
}
|
||||
if (spos.z < near_split.x)
|
||||
{
|
||||
shadow += vsmDirectionalSample(spos, depth, shadowMap1, shadow_matrix[1]);
|
||||
weight += 1.0f;
|
||||
}
|
||||
if (spos.z > far_split.x)
|
||||
{
|
||||
shadow += vsmDirectionalSample(spos, depth, shadowMap0, shadow_matrix[0]);
|
||||
weight += 1.0f;
|
||||
}
|
||||
|
||||
shadow /= weight;
|
||||
|
||||
return shadow;
|
||||
}
|
||||
|
||||
float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen)
|
||||
{
|
||||
if (pos.z < -shadow_clip.w)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
float depth = getDepth(pos_screen);
|
||||
|
||||
pos += norm * spot_shadow_offset;
|
||||
return vsmSpotSample(vec4(pos, 1.0), depth, (index == 0) ? shadowMap4 : shadowMap5, shadow_matrix[4 + index]);
|
||||
}
|
||||
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/shadowV.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$
|
||||
*/
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform float shadow_target_width;
|
||||
uniform mat4 texture_matrix0;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING float pos_zd2;
|
||||
#endif
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
|
||||
pos = modelview_projection_matrix * pre_pos;
|
||||
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
pos_zd2 = pos.z * 0.5;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
#else
|
||||
gl_Position = pos;
|
||||
#endif
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
}
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
/**
|
||||
* @file class3/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$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
|
||||
uniform vec3 camPosLocal;
|
||||
uniform vec3 sun_dir;
|
||||
uniform float sun_size;
|
||||
uniform float far_z;
|
||||
uniform mat4 inv_proj;
|
||||
uniform mat4 inv_modelview;
|
||||
|
||||
uniform sampler2D transmittance_texture;
|
||||
uniform sampler3D scattering_texture;
|
||||
uniform sampler3D single_mie_scattering_texture;
|
||||
uniform sampler2D irradiance_texture;
|
||||
uniform sampler2D rainbow_map;
|
||||
uniform sampler2D halo_map;
|
||||
|
||||
uniform float moisture_level;
|
||||
uniform float droplet_radius;
|
||||
uniform float ice_level;
|
||||
|
||||
vec3 GetSolarLuminance();
|
||||
vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
|
||||
vec3 ColorFromRadiance(vec3 radiance);
|
||||
vec3 rainbow(float d)
|
||||
{
|
||||
// d is the dot product of view and sun directions, so ranging -1.0..1.0
|
||||
// 'interesting' values of d are the range -0.75..-0.825, when view is nearly opposite of sun vec
|
||||
// Rainbox texture mode is GL_REPEAT, so tc of -.75 is equiv to 0.25, -0.825 equiv to 0.175.
|
||||
|
||||
// SL-13629 Rainbow texture has colors within the correct .175...250 range, but order is inverted.
|
||||
// Rather than replace the texture, we mirror and translate the y tc to keep the colors within the
|
||||
// interesting range, but in reversed order: i.e. d = (1 - d) - 1.575
|
||||
d = clamp(-0.575 - d, 0.0, 1.0);
|
||||
|
||||
// With the colors in the lower 1/4 of the texture, inverting the coords leaves most of it inaccessible.
|
||||
// So, we can stretch the texcoord above the colors (ie > 0.25) to fill the entire remaining coordinate
|
||||
// space. This improves gradation, reduces banding within the rainbow interior. (1-0.25) / (0.425/0.25) = 4.2857
|
||||
float interior_coord = max(0.0, d - 0.25) * 4.2857;
|
||||
d = clamp(d, 0.0, 0.25) + interior_coord;
|
||||
|
||||
float rad = (droplet_radius - 5.0f) / 1024.0f;
|
||||
return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
|
||||
}
|
||||
|
||||
vec3 halo22(float d)
|
||||
{
|
||||
float v = sqrt(max(0, 1 - (d*d)));
|
||||
return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 pos = vec3((vary_frag * 2.0) - vec2(1.0, 1.0f), 1.0);
|
||||
vec4 view_pos = (inv_proj * vec4(pos, 1.0f));
|
||||
|
||||
view_pos /= view_pos.w;
|
||||
|
||||
vec3 view_ray = (inv_modelview * vec4(view_pos.xyz, 0.0f)).xyz + camPosLocal;
|
||||
|
||||
vec3 view_direction = normalize(view_ray);
|
||||
vec3 sun_direction = normalize(sun_dir);
|
||||
vec3 earth_center = vec3(0, 0, -6360.0f);
|
||||
vec3 camPos = (camPosLocal / 1000.0f) - earth_center;
|
||||
|
||||
vec3 transmittance;
|
||||
vec3 radiance_sun = GetSkyLuminance(camPos, view_direction, 0.0f, sun_direction, transmittance);
|
||||
vec3 solar_luminance = GetSolarLuminance();
|
||||
|
||||
// If the view ray intersects the Sun, add the Sun radiance.
|
||||
float s = dot(view_direction, sun_direction);
|
||||
|
||||
// cheesy solar disc...
|
||||
if (s >= (sun_size * 0.999))
|
||||
{
|
||||
radiance_sun += pow(smoothstep(0.0, 1.3, (s - (sun_size * 0.9))), 2.0) * solar_luminance * transmittance;
|
||||
}
|
||||
s = smoothstep(0.9, 1.0, s) * 16.0f;
|
||||
|
||||
vec3 color = ColorFromRadiance(radiance_sun);
|
||||
|
||||
float optic_d = dot(view_direction, sun_direction);
|
||||
vec3 halo_22 = halo22(optic_d);
|
||||
|
||||
color.rgb += rainbow(optic_d) * optic_d;
|
||||
color.rgb += halo_22;
|
||||
|
||||
color = pow(color, vec3(1.0/2.2));
|
||||
|
||||
frag_data[0] = vec4(color, 1.0 + s);
|
||||
frag_data[1] = vec4(0.0);
|
||||
frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/skyV.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$
|
||||
*/
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
VARYING vec2 vary_frag;
|
||||
|
||||
void main()
|
||||
{
|
||||
// pass through untransformed fullscreen pos at back of frustum for proper sky depth testing
|
||||
gl_Position = vec4(position.xy, 1.0f, 1.0);
|
||||
vary_frag = texcoord0;
|
||||
}
|
||||
|
||||
|
|
@ -1,31 +1,35 @@
|
|||
/**
|
||||
* @file class3/deferred/softenLightF.glsl
|
||||
/**
|
||||
* @file class2/deferred/softenLightF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
#extension GL_ARB_shader_texture_lod : enable
|
||||
|
||||
#define FLT_MAX 3.402823466e+38
|
||||
|
||||
#define REFMAP_COUNT 256
|
||||
#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
|
|
@ -36,142 +40,153 @@ out vec4 frag_color;
|
|||
uniform sampler2DRect diffuseRect;
|
||||
uniform sampler2DRect specularRect;
|
||||
uniform sampler2DRect normalMap;
|
||||
|
||||
#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
|
||||
uniform sampler2DRect lightMap;
|
||||
#endif
|
||||
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
uniform float blur_size;
|
||||
uniform float blur_fidelity;
|
||||
|
||||
// Inputs
|
||||
uniform vec4 morphFactor;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform float cloud_shadow;
|
||||
uniform float max_y;
|
||||
uniform vec4 glow;
|
||||
uniform mat3 env_mat;
|
||||
uniform vec4 shadow_clip;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
uniform int sun_up_factor;
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
uniform mat4 inv_modelview;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform sampler2D transmittance_texture;
|
||||
uniform sampler3D scattering_texture;
|
||||
uniform sampler3D single_mie_scattering_texture;
|
||||
uniform sampler2D irradiance_texture;
|
||||
|
||||
uniform sampler2D sh_input_r;
|
||||
uniform sampler2D sh_input_g;
|
||||
uniform sampler2D sh_input_b;
|
||||
|
||||
vec3 GetSunAndSkyIrradiance(vec3 camPos, vec3 norm, vec3 dir, out vec3 sky_irradiance);
|
||||
vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 dir, out vec3 transmittance);
|
||||
|
||||
vec3 ColorFromRadiance(vec3 radiance);
|
||||
vec4 getPositionWithDepth(vec2 pos_screen, float depth);
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
vec4 getPositionWithDepth(vec2 pos_screen, float depth);
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
float getAmbientClamp();
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,
|
||||
vec3 pos, vec3 norm, float glossiness, float envIntensity);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 applyWaterFogView(vec3 pos, vec4 color);
|
||||
#endif
|
||||
|
||||
void main()
|
||||
void main()
|
||||
{
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
float depth = texture2DRect(depthMap, tc.xy).r;
|
||||
vec3 pos = getPositionWithDepth(tc, depth).xyz;
|
||||
vec4 norm = texture2DRect(normalMap, tc);
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
float depth = texture2DRect(depthMap, tc.xy).r;
|
||||
vec4 pos = getPositionWithDepth(tc, depth);
|
||||
vec4 norm = texture2DRect(normalMap, tc);
|
||||
float envIntensity = norm.z;
|
||||
norm.xyz = getNorm(tc);
|
||||
norm.xyz = getNorm(tc);
|
||||
|
||||
float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
|
||||
float light_gamma = 1.0 / 1.3;
|
||||
da = pow(da, light_gamma);
|
||||
|
||||
vec4 diffuse = texture2DRect(diffuseRect, tc); // sRGB
|
||||
diffuse.rgb = srgb_to_linear(diffuse.rgb);
|
||||
vec4 diffuse = texture2DRect(diffuseRect, tc);
|
||||
diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14025
|
||||
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
|
||||
|
||||
vec3 col;
|
||||
|
||||
#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
|
||||
vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
|
||||
scol_ambocc = pow(scol_ambocc, vec2(light_gamma));
|
||||
float scol = max(scol_ambocc.r, diffuse.a);
|
||||
float ambocc = scol_ambocc.g;
|
||||
#else
|
||||
float scol = 1.0;
|
||||
float ambocc = 1.0;
|
||||
#endif
|
||||
|
||||
vec3 color = vec3(0);
|
||||
float bloom = 0.0;
|
||||
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
|
||||
|
||||
//vec3 amb_vec = env_mat * norm.xyz;
|
||||
|
||||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
|
||||
|
||||
amblit = max(ambenv, amblit);
|
||||
color.rgb = amblit*ambocc;
|
||||
|
||||
//float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
//ambient *= 0.5;
|
||||
//ambient *= ambient;
|
||||
//ambient = (1.0 - ambient);
|
||||
//color.rgb *= ambient;
|
||||
|
||||
vec3 sun_contrib = min(da, scol) * sunlit;
|
||||
color.rgb += sun_contrib;
|
||||
color.rgb = min(color.rgb, vec3(1,1,1));
|
||||
color.rgb *= diffuse.rgb;
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
vec3 camPos = (camPosLocal / 1000.0f) + vec3(0, 0, 6360.0f);
|
||||
float sa = dot(normalize(refnormpersp), light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
|
||||
|
||||
vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
color.rgb += spec_contrib;
|
||||
|
||||
float scol = max(scol_ambocc.r, diffuse.a);
|
||||
|
||||
float ambocc = scol_ambocc.g;
|
||||
|
||||
vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));
|
||||
vec4 l1r = texture2D(sh_input_r, vec2(0,0));
|
||||
vec4 l1g = texture2D(sh_input_g, vec2(0,0));
|
||||
vec4 l1b = texture2D(sh_input_b, vec2(0,0));
|
||||
|
||||
vec3 indirect = vec3(dot(l1r, l1tap * vec4(1, norm.xyz)),
|
||||
dot(l1g, l1tap * vec4(1, norm.xyz)),
|
||||
dot(l1b, l1tap * vec4(1, norm.xyz)));
|
||||
|
||||
indirect = clamp(indirect, vec3(0), vec3(1.0));
|
||||
|
||||
vec3 transmittance;
|
||||
vec3 sky_irradiance;
|
||||
vec3 sun_irradiance = GetSunAndSkyIrradiance(camPos, norm.xyz, sun_dir, sky_irradiance);
|
||||
vec3 inscatter = GetSkyLuminanceToPoint(camPos, (pos / 1000.f) + vec3(0, 0, 6360.0f), scol, sun_dir, transmittance);
|
||||
|
||||
vec3 radiance = scol * (sun_irradiance + sky_irradiance) + inscatter;
|
||||
vec3 atmo_color = ColorFromRadiance(radiance);
|
||||
|
||||
col = atmo_color + indirect;
|
||||
col *= transmittance;
|
||||
col *= diffuse.rgb;
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
// the old infinite-sky shiny reflection
|
||||
//
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = scol * texture2D(lightFunc, vec2(sa, spec.a)).r * atmo_color;
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb * 0.25;
|
||||
bloom = dot(spec_contrib, spec_contrib);
|
||||
col += spec_contrib;
|
||||
}
|
||||
|
||||
col = mix(col, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{ //add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
vec3 sun_direction = (inv_modelview * vec4(sun_dir, 1.0)).xyz;
|
||||
vec3 radiance_sun = GetSkyLuminance(camPos, env_vec, 0.0f, sun_direction, transmittance);
|
||||
vec3 refcol = ColorFromRadiance(radiance_sun);
|
||||
col = mix(col.rgb, refcol, envIntensity);
|
||||
}
|
||||
|
||||
/*if (norm.w < 0.5)
|
||||
{
|
||||
col = scaleSoftClipFrag(col);
|
||||
}*/
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 fogged = applyWaterFogView(pos,vec4(col, bloom));
|
||||
col = fogged.rgb;
|
||||
bloom = fogged.a;
|
||||
#endif
|
||||
// add reflection map - EXPERIMENTAL WORK IN PROGRESS
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
}
|
||||
|
||||
//output linear since gamma correction happens down stream
|
||||
frag_color.rgb = col;
|
||||
color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{ // add environmentmap
|
||||
//fudge darker
|
||||
legacyenv *= 0.5*diffuse.a+0.5;;
|
||||
applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
|
||||
}
|
||||
|
||||
if (norm.w < 0.5)
|
||||
{
|
||||
color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
|
||||
color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
|
||||
}
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom));
|
||||
color = fogged.rgb;
|
||||
bloom = fogged.a;
|
||||
#endif
|
||||
|
||||
// convert to linear as fullscreen lights need to sum in linear colorspace
|
||||
// and will be gamma (re)corrected downstream...
|
||||
//color = vec3(ambocc);
|
||||
//color = ambenv;
|
||||
//color.b = diffuse.a;
|
||||
frag_color.rgb = srgb_to_linear(color.rgb);
|
||||
frag_color.a = bloom;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* @file class3/deferred/softenLightV.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$
|
||||
*/
|
||||
ATTRIBUTE vec3 position;
|
||||
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
gl_Position = pos;
|
||||
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
|
||||
}
|
||||
|
|
@ -1,287 +0,0 @@
|
|||
/**
|
||||
* @file spotLightF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
#extension GL_ARB_shader_texture_lod : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2DRect diffuseRect;
|
||||
uniform sampler2DRect specularRect;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2DRect normalMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2DRect lightMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D projectionMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform mat4 proj_mat; //screen space to light space
|
||||
uniform float proj_near; //near clip for projection
|
||||
uniform vec3 proj_p; //plane projection is emitting from (in screen space)
|
||||
uniform vec3 proj_n;
|
||||
uniform float proj_focus; //distance from plane to begin blurring
|
||||
uniform float proj_lod; //(number of mips in proj map)
|
||||
uniform float proj_range; //range between near clip and far clip plane of projection
|
||||
uniform float proj_ambient_lod;
|
||||
uniform float proj_ambiance;
|
||||
uniform float near_clip;
|
||||
uniform float far_clip;
|
||||
|
||||
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
|
||||
uniform float sun_wash;
|
||||
uniform int proj_shadow_idx;
|
||||
uniform float shadow_fade;
|
||||
|
||||
uniform float size;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
|
||||
VARYING vec3 trans_center;
|
||||
VARYING vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
|
||||
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
|
||||
|
||||
float det = min(lod/(proj_lod*0.5), 1.0);
|
||||
|
||||
float d = min(dist.x, dist.y);
|
||||
|
||||
d *= min(1, d * (proj_lod - lod));
|
||||
|
||||
float edge = 0.25*det;
|
||||
|
||||
ret *= clamp(d/edge, 0.0, 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
|
||||
|
||||
float det = min(lod/(proj_lod*0.5), 1.0);
|
||||
|
||||
float d = min(dist.x, dist.y);
|
||||
|
||||
float edge = 0.25*det;
|
||||
|
||||
ret *= clamp(d/edge, 0.0, 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
|
||||
vec2 dist = tc-vec2(0.5);
|
||||
|
||||
float d = dot(dist,dist);
|
||||
|
||||
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 frag = vary_fragcoord;
|
||||
frag.xyz /= frag.w;
|
||||
frag.xyz = frag.xyz*0.5+0.5;
|
||||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = trans_center.xyz-pos.xyz;
|
||||
float dist = length(lv);
|
||||
dist /= size;
|
||||
if (dist > 1.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
float shadow = 1.0;
|
||||
|
||||
if (proj_shadow_idx >= 0)
|
||||
{
|
||||
vec4 shd = texture2DRect(lightMap, frag.xy);
|
||||
shadow = (proj_shadow_idx == 0) ? shd.b : shd.a;
|
||||
shadow += shadow_fade;
|
||||
shadow = clamp(shadow, 0.0, 1.0);
|
||||
}
|
||||
|
||||
vec3 norm = texture2DRect(normalMap, frag.xy).xyz;
|
||||
float envIntensity = norm.z;
|
||||
norm = getNorm(frag.xy);
|
||||
|
||||
norm = normalize(norm);
|
||||
float l_dist = -dot(lv, proj_n);
|
||||
|
||||
vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
|
||||
if (proj_tc.z < 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
proj_tc.xyz /= proj_tc.w;
|
||||
|
||||
float fa = (falloff*0.5) + 1.0;
|
||||
float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0;
|
||||
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
lv = proj_origin-pos.xyz;
|
||||
lv = normalize(lv);
|
||||
float da = dot(norm, lv);
|
||||
|
||||
vec3 col = vec3(0,0,0);
|
||||
|
||||
vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, frag.xy);
|
||||
|
||||
vec3 dlit = vec3(0, 0, 0);
|
||||
|
||||
float noise = texture2D(noiseMap, frag.xy/128.0).b;
|
||||
if (proj_tc.z > 0.0 &&
|
||||
proj_tc.x < 1.0 &&
|
||||
proj_tc.y < 1.0 &&
|
||||
proj_tc.x > 0.0 &&
|
||||
proj_tc.y > 0.0)
|
||||
{
|
||||
float amb_da = proj_ambiance;
|
||||
float lit = 0.0;
|
||||
|
||||
if (da > 0.0)
|
||||
{
|
||||
lit = da * dist_atten * noise;
|
||||
|
||||
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
dlit = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
col = dlit*lit*diff_tex*shadow;
|
||||
amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
|
||||
}
|
||||
|
||||
//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
|
||||
vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
|
||||
|
||||
amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance;
|
||||
|
||||
amb_da *= dist_atten * noise;
|
||||
|
||||
amb_da = min(amb_da, 1.0-lit);
|
||||
|
||||
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
dlit *= min(da*6.0, 1.0) * dist_atten;
|
||||
vec3 npos = -normalize(pos);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv+npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
col += dlit*scol*spec.rgb*shadow;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
vec3 ref = reflect(normalize(pos), norm);
|
||||
|
||||
//project from point pos in direction ref to plane proj_p, proj_n
|
||||
vec3 pdelta = proj_p-pos;
|
||||
float ds = dot(ref, proj_n);
|
||||
|
||||
if (ds < 0.0)
|
||||
{
|
||||
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
|
||||
|
||||
vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
|
||||
|
||||
if (stc.z > 0.0)
|
||||
{
|
||||
stc /= stc.w;
|
||||
|
||||
if (stc.x < 1.0 &&
|
||||
stc.y < 1.0 &&
|
||||
stc.x > 0.0 &&
|
||||
stc.y > 0.0)
|
||||
{
|
||||
col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//not sure why, but this line prevents MATBUG-194
|
||||
col = max(col, vec3(0.0));
|
||||
|
||||
frag_color.rgb = col;
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/**
|
||||
* @file class3\deferred\sunLightF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
//class 2, shadows, no SSAO
|
||||
|
||||
// Inputs
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pos_screen = vary_fragcoord.xy;
|
||||
vec4 pos = getPosition(pos_screen);
|
||||
vec3 norm = getNorm(pos_screen);
|
||||
|
||||
frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
frag_color.g = 1.0f;
|
||||
frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
}
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
/**
|
||||
* @file class3\deferred\sunLightSSAOF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
//class 2 -- shadows and SSAO
|
||||
|
||||
// Inputs
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);
|
||||
|
||||
//calculate decreases in ambient lighting when crowded out (SSAO)
|
||||
float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pos_screen = vary_fragcoord.xy;
|
||||
vec4 pos = getPosition(pos_screen);
|
||||
vec3 norm = getNorm(pos_screen);
|
||||
|
||||
frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
frag_color.b = calcAmbientOcclusion(pos, norm, pos_screen);
|
||||
frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
/**
|
||||
* @file sunLightV.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_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
gl_Position = pos;
|
||||
|
||||
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* @file treeShadowF.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]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec4 computeMoments(float d, float a);
|
||||
|
||||
void main()
|
||||
{
|
||||
float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a;
|
||||
|
||||
if (alpha < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
frag_color = computeMoments(length(pos), 1.0);
|
||||
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(pos.z/pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
* @file treeShadowV.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_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
VARYING vec4 pos;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
}
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
/**
|
||||
* @file underWaterF.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]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
uniform sampler2D bumpMap;
|
||||
uniform sampler2D screenTex;
|
||||
uniform sampler2D refTex;
|
||||
uniform sampler2D screenDepth;
|
||||
|
||||
uniform vec4 fogCol;
|
||||
uniform vec3 lightDir;
|
||||
uniform vec3 specular;
|
||||
uniform float lightExp;
|
||||
uniform vec2 fbScale;
|
||||
uniform float refScale;
|
||||
uniform float znear;
|
||||
uniform float zfar;
|
||||
uniform float kd;
|
||||
uniform vec4 waterPlane;
|
||||
uniform vec3 eyeVec;
|
||||
uniform vec4 waterFogColor;
|
||||
uniform float waterFogDensity;
|
||||
uniform float waterFogKS;
|
||||
uniform vec2 screenRes;
|
||||
|
||||
//bigWave is (refCoord.w, view.w);
|
||||
VARYING vec4 refCoord;
|
||||
VARYING vec4 littleWave;
|
||||
VARYING vec4 view;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
vec4 applyWaterFog(vec4 color, vec3 viewVec)
|
||||
{
|
||||
//normalize view vector
|
||||
vec3 view = normalize(viewVec);
|
||||
float es = -view.z;
|
||||
|
||||
//find intersection point with water plane and eye vector
|
||||
|
||||
//get eye depth
|
||||
float e0 = max(-waterPlane.w, 0.0);
|
||||
|
||||
//get object depth
|
||||
float depth = length(viewVec);
|
||||
|
||||
//get "thickness" of water
|
||||
float l = max(depth, 0.1);
|
||||
|
||||
float kd = waterFogDensity;
|
||||
float ks = waterFogKS;
|
||||
vec4 kc = waterFogColor;
|
||||
|
||||
float F = 0.98;
|
||||
|
||||
float t1 = -kd * pow(F, ks * e0);
|
||||
float t2 = kd + ks * es;
|
||||
float t3 = pow(F, t2*l) - 1.0;
|
||||
|
||||
float L = min(t1/t2*t3, 1.0);
|
||||
|
||||
float D = pow(0.98, l*kd);
|
||||
return color * D + kc * L;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color;
|
||||
|
||||
//get detail normals
|
||||
vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
|
||||
vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
|
||||
vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
|
||||
vec3 wavef = normalize(wave1+wave2+wave3);
|
||||
|
||||
//figure out distortion vector (ripply)
|
||||
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
|
||||
distort = distort+wavef.xy*refScale;
|
||||
|
||||
vec4 fb = texture2D(screenTex, distort);
|
||||
|
||||
frag_data[0] = vec4(fb.rgb, 1.0); // diffuse
|
||||
frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec
|
||||
frag_data[2] = vec4(encode_normal(wavef), 0.0, 0.0); // normalxyz, displace
|
||||
}
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
/**
|
||||
* @file waterF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
|
||||
uniform sampler2D bumpMap;
|
||||
uniform sampler2D bumpMap2;
|
||||
uniform float blend_factor;
|
||||
uniform sampler2D screenTex;
|
||||
uniform sampler2D refTex;
|
||||
|
||||
uniform float sunAngle;
|
||||
uniform float sunAngle2;
|
||||
uniform vec3 lightDir;
|
||||
uniform vec3 specular;
|
||||
uniform float lightExp;
|
||||
uniform float refScale;
|
||||
uniform float kd;
|
||||
uniform vec2 screenRes;
|
||||
uniform vec3 normScale;
|
||||
uniform float fresnelScale;
|
||||
uniform float fresnelOffset;
|
||||
uniform float blurMultiplier;
|
||||
uniform vec2 screen_res;
|
||||
uniform mat4 norm_mat; //region space to screen space
|
||||
|
||||
//bigWave is (refCoord.w, view.w);
|
||||
VARYING vec4 refCoord;
|
||||
VARYING vec4 littleWave;
|
||||
VARYING vec4 view;
|
||||
VARYING vec4 vary_position;
|
||||
|
||||
vec3 scaleSoftClip(vec3 c);
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
vec3 BlendNormal(vec3 bump1, vec3 bump2)
|
||||
{
|
||||
//vec3 normal = bump1.xyz * vec3( 2.0, 2.0, 2.0) - vec3(1.0, 1.0, 0.0);
|
||||
//vec3 normal2 = bump2.xyz * vec3(-2.0, -2.0, 2.0) + vec3(1.0, 1.0, -1.0);
|
||||
//vec3 n = normalize(normal * dot(normal, normal2) - (normal2 * normal.z));
|
||||
vec3 n = normalize(mix(bump1, bump2, blend_factor));
|
||||
return n;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color;
|
||||
float dist = length(view.xy);
|
||||
|
||||
//normalize view vector
|
||||
vec3 viewVec = normalize(view.xyz);
|
||||
|
||||
//get wave normals
|
||||
vec3 wave1_a = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
|
||||
vec3 wave2_a = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
|
||||
vec3 wave3_a = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
|
||||
|
||||
|
||||
vec3 wave1_b = texture2D(bumpMap2, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
|
||||
vec3 wave2_b = texture2D(bumpMap2, littleWave.xy).xyz*2.0-1.0;
|
||||
vec3 wave3_b = texture2D(bumpMap2, littleWave.zw).xyz*2.0-1.0;
|
||||
|
||||
vec3 wave1 = BlendNormal(wave1_a, wave1_b);
|
||||
vec3 wave2 = BlendNormal(wave2_a, wave2_b);
|
||||
vec3 wave3 = BlendNormal(wave3_a, wave3_b);
|
||||
|
||||
//get base fresnel components
|
||||
|
||||
vec3 df = vec3(
|
||||
dot(viewVec, wave1),
|
||||
dot(viewVec, (wave2 + wave3) * 0.5),
|
||||
dot(viewVec, wave3)
|
||||
) * fresnelScale + fresnelOffset;
|
||||
df *= df;
|
||||
|
||||
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
|
||||
|
||||
float dist2 = dist;
|
||||
dist = max(dist, 5.0);
|
||||
|
||||
float dmod = sqrt(dist);
|
||||
|
||||
vec2 dmod_scale = vec2(dmod*dmod, dmod);
|
||||
|
||||
//get reflected color
|
||||
vec2 refdistort1 = wave1.xy*normScale.x;
|
||||
vec2 refvec1 = distort+refdistort1/dmod_scale;
|
||||
vec4 refcol1 = texture2D(refTex, refvec1);
|
||||
|
||||
vec2 refdistort2 = wave2.xy*normScale.y;
|
||||
vec2 refvec2 = distort+refdistort2/dmod_scale;
|
||||
vec4 refcol2 = texture2D(refTex, refvec2);
|
||||
|
||||
vec2 refdistort3 = wave3.xy*normScale.z;
|
||||
vec2 refvec3 = distort+refdistort3/dmod_scale;
|
||||
vec4 refcol3 = texture2D(refTex, refvec3);
|
||||
|
||||
vec4 refcol = refcol1 + refcol2 + refcol3;
|
||||
float df1 = df.x + df.y + df.z;
|
||||
refcol *= df1 * 0.333;
|
||||
|
||||
vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
|
||||
wavef.z *= max(-viewVec.z, 0.1);
|
||||
wavef = normalize(wavef);
|
||||
|
||||
float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
|
||||
|
||||
vec2 refdistort4 = wavef.xy*0.125;
|
||||
refdistort4.y -= abs(refdistort4.y);
|
||||
vec2 refvec4 = distort+refdistort4/dmod;
|
||||
float dweight = min(dist2*blurMultiplier, 1.0);
|
||||
vec4 baseCol = texture2D(refTex, refvec4);
|
||||
|
||||
refcol = mix(baseCol*df2, refcol, dweight);
|
||||
|
||||
//get specular component
|
||||
float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
|
||||
|
||||
//harden specular
|
||||
spec = pow(spec, 128.0);
|
||||
|
||||
//figure out distortion vector (ripply)
|
||||
vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
|
||||
|
||||
vec4 fb = texture2D(screenTex, distort2);
|
||||
|
||||
//mix with reflection
|
||||
// Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug
|
||||
color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
|
||||
|
||||
color.rgb *= 2.0f;
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
vec4 pos = vary_position;
|
||||
|
||||
color.rgb += spec * specular;
|
||||
color.a = spec * sunAngle2;
|
||||
|
||||
vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz);
|
||||
|
||||
frag_data[0] = vec4(color.rgb, color); // diffuse
|
||||
frag_data[1] = vec4(spec * specular, spec); // speccolor, spec
|
||||
frag_data[2] = vec4(encode_normal(wavef.xyz), 0.05, 0);// normalxy, 0, 0
|
||||
}
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
/**
|
||||
* @file waterV.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 modelview_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
||||
|
||||
uniform vec2 d1;
|
||||
uniform vec2 d2;
|
||||
uniform float time;
|
||||
uniform vec3 eyeVec;
|
||||
uniform float waterHeight;
|
||||
|
||||
VARYING vec4 refCoord;
|
||||
VARYING vec4 littleWave;
|
||||
VARYING vec4 view;
|
||||
|
||||
VARYING vec4 vary_position;
|
||||
|
||||
float wave(vec2 v, float t, float f, vec2 d, float s)
|
||||
{
|
||||
return (dot(d, v)*f + t*s)*f;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pos = vec4(position.xyz, 1.0);
|
||||
mat4 modelViewProj = modelview_projection_matrix;
|
||||
|
||||
vec4 oPosition;
|
||||
|
||||
//get view vector
|
||||
vec3 oEyeVec;
|
||||
oEyeVec.xyz = pos.xyz-eyeVec;
|
||||
|
||||
float d = length(oEyeVec.xy);
|
||||
float ld = min(d, 2560.0);
|
||||
|
||||
pos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
|
||||
view.xyz = oEyeVec;
|
||||
|
||||
d = clamp(ld/1536.0-0.5, 0.0, 1.0);
|
||||
d *= d;
|
||||
|
||||
oPosition = vec4(position, 1.0);
|
||||
oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
|
||||
vary_position = modelview_matrix * oPosition;
|
||||
oPosition = modelViewProj * oPosition;
|
||||
|
||||
refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
|
||||
|
||||
//get wave position parameter (create sweeping horizontal waves)
|
||||
vec3 v = pos.xyz;
|
||||
v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
|
||||
|
||||
//push position for further horizon effect.
|
||||
pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
|
||||
pos.w = 1.0;
|
||||
pos = modelview_matrix*pos;
|
||||
|
||||
//pass wave parameters to pixel shader
|
||||
vec2 bigWave = (v.xy) * vec2(0.04,0.04) + d1 * time * 0.055;
|
||||
//get two normal map (detail map) texture coordinates
|
||||
littleWave.xy = (v.xy) * vec2(0.45, 0.9) + d2 * time * 0.13;
|
||||
littleWave.zw = (v.xy) * vec2(0.1, 0.2) + d1 * time * 0.1;
|
||||
view.w = bigWave.y;
|
||||
refCoord.w = bigWave.x;
|
||||
|
||||
gl_Position = oPosition;
|
||||
}
|
||||
|
|
@ -468,12 +468,12 @@ void LLDrawPoolBump::beginFullbrightShiny()
|
|||
LLVector4 vec4(vec, gShinyOrigin.mV[3]);
|
||||
shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV);
|
||||
|
||||
cube_map->setMatrix(1);
|
||||
if (shader->mFeatures.hasReflectionProbes)
|
||||
{
|
||||
gPipeline.bindReflectionProbes(*shader);
|
||||
}
|
||||
|
||||
cube_map->setMatrix(1);
|
||||
// Make sure that texture coord generation happens for tex unit 1, as that's the one we use for
|
||||
// the cube map in the one pass shiny shaders
|
||||
gGL.getTexUnit(1)->disable();
|
||||
|
|
|
|||
|
|
@ -2089,6 +2089,7 @@ void LLFloaterPreference::refreshEnabledState()
|
|||
// <FS:Ansariel> Improved graphics preferences
|
||||
//LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
|
||||
//LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
|
||||
LLCheckBoxCtrl* ctrl_pbr = getChild<LLCheckBoxCtrl>("UsePBRShaders");
|
||||
|
||||
//// if vertex shaders off, disable all shader related products
|
||||
//if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
|
||||
|
|
@ -2226,6 +2227,11 @@ void LLFloaterPreference::refreshEnabledState()
|
|||
|
||||
ctrl_deferred->setEnabled(enabled);
|
||||
|
||||
//PBR
|
||||
BOOL deferred = gSavedSettings.getBOOL("RenderDeferred");
|
||||
// TODO: add "RenderPBR" to LLFeatureManager
|
||||
ctrl_pbr->setEnabled(deferred);
|
||||
|
||||
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
|
||||
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
|
||||
LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ struct CompareProbeDistance
|
|||
// helper class to seed octree with probes
|
||||
void LLReflectionMapManager::update()
|
||||
{
|
||||
if (!LLPipeline::sRenderDeferred || gTeleportDisplay)
|
||||
if (!LLPipeline::sRenderPBR || gTeleportDisplay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -652,6 +652,7 @@ void LLReflectionMapManager::updateUniforms()
|
|||
|
||||
void LLReflectionMapManager::setUniforms()
|
||||
{
|
||||
llassert(LLPipeline::sRenderPBR);
|
||||
if (mUBO == 0)
|
||||
{
|
||||
updateUniforms();
|
||||
|
|
@ -662,7 +663,6 @@ void LLReflectionMapManager::setUniforms()
|
|||
|
||||
void renderReflectionProbe(LLReflectionMap* probe)
|
||||
{
|
||||
|
||||
F32* po = probe->mOrigin.getF32ptr();
|
||||
|
||||
//draw orange line from probe to neighbors
|
||||
|
|
|
|||
|
|
@ -378,13 +378,12 @@ public:
|
|||
F32 mPixelArea;
|
||||
F32 mRadius;
|
||||
|
||||
// Reflection Probe associated with this node (if any)
|
||||
LLPointer<LLReflectionMap> mReflectionProbe = nullptr;
|
||||
|
||||
|
||||
//used by LLVOAVatar to set render order in alpha draw pool to preserve legacy render order behavior
|
||||
LLVOAvatar* mAvatarp = nullptr;
|
||||
U32 mRenderOrder = 0;
|
||||
// Reflection Probe associated with this node (if any)
|
||||
LLPointer<LLReflectionMap> mReflectionProbe = nullptr;
|
||||
|
||||
} LL_ALIGN_POSTFIX(64);
|
||||
|
||||
class LLGeometryManager
|
||||
|
|
|
|||
|
|
@ -547,9 +547,10 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
|
|||
return true;
|
||||
}
|
||||
|
||||
// NOTE: may be triggered by RenderDeferred OR RenderPBR changing, don't trust "newvalue"
|
||||
static bool handleRenderDeferredChanged(const LLSD& newvalue)
|
||||
{
|
||||
LLRenderTarget::sUseFBO = newvalue.asBoolean();
|
||||
LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
|
||||
if (gPipeline.isInit())
|
||||
{
|
||||
LLPipeline::refreshCachedSettings();
|
||||
|
|
@ -1200,6 +1201,7 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("RenderResolutionMultiplier")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
|
||||
// [/SL:KB]
|
||||
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
|
||||
gSavedSettings.getControl("RenderPBR")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
|
||||
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
|
||||
gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@
|
|||
#include "lljoint.h"
|
||||
#include "llskinningutil.h"
|
||||
|
||||
//#pragma optimize("", off)
|
||||
|
||||
static LLStaticHashedString sTexture0("texture0");
|
||||
static LLStaticHashedString sTexture1("texture1");
|
||||
static LLStaticHashedString sTex0("tex0");
|
||||
|
|
@ -498,6 +500,7 @@ void LLViewerShaderMgr::setShaders()
|
|||
bool canRenderDeferred = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
|
||||
bool hasWindLightShaders = LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders");
|
||||
S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
|
||||
bool pbr = gSavedSettings.getBOOL("RenderPBR");
|
||||
bool doingWindLight = hasWindLightShaders && gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
bool useRenderDeferred = doingWindLight && canRenderDeferred && gSavedSettings.getBOOL("RenderDeferred");
|
||||
|
||||
|
|
@ -537,6 +540,11 @@ void LLViewerShaderMgr::setShaders()
|
|||
}
|
||||
}
|
||||
|
||||
if (deferred_class > 0 && pbr)
|
||||
{
|
||||
deferred_class = 3;
|
||||
}
|
||||
|
||||
if (doingWindLight)
|
||||
{
|
||||
// user has disabled WindLight in their settings, downgrade
|
||||
|
|
@ -668,8 +676,8 @@ void LLViewerShaderMgr::setShaders()
|
|||
// Load max avatar shaders to set the max level
|
||||
mShaderLevel[SHADER_AVATAR] = 3;
|
||||
mMaxAvatarShaderLevel = 3;
|
||||
|
||||
if (loadShadersObject())
|
||||
|
||||
if (loadShadersObject())
|
||||
{ //hardware skinning is enabled and rigged attachment shaders loaded correctly
|
||||
BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
|
||||
|
||||
|
|
@ -1242,7 +1250,8 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
|
|||
|
||||
BOOL LLViewerShaderMgr::loadShadersDeferred()
|
||||
{
|
||||
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1;
|
||||
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 &&
|
||||
gSavedSettings.getS32("RenderShadowDetail") > 0;
|
||||
|
||||
BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
|
||||
BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
|
||||
|
|
@ -1525,7 +1534,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredMaterialProgram[i].mFeatures.hasGamma = true;
|
||||
gDeferredMaterialProgram[i].mFeatures.hasShadows = use_sun_shadow;
|
||||
|
||||
if (mShaderLevel[SHADER_DEFERRED] > 1)
|
||||
if (mShaderLevel[SHADER_DEFERRED] > 2)
|
||||
{
|
||||
gDeferredMaterialProgram[i].mFeatures.hasReflectionProbes = true;
|
||||
gDeferredMaterialProgram[i].addPermutation("HAS_REFLECTION_PROBES", "1");
|
||||
|
|
@ -2230,7 +2239,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredFullbrightShinyProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
if (gDeferredFullbrightShinyProgram.mShaderLevel >= 2) // TODO : make this a 3 when reflection probes are restricted to class 3
|
||||
if (gDeferredFullbrightShinyProgram.mShaderLevel > 2)
|
||||
{
|
||||
gDeferredFullbrightShinyProgram.addPermutation("HAS_REFLECTION_PROBES", "1");
|
||||
gDeferredFullbrightShinyProgram.mFeatures.hasReflectionProbes = true;
|
||||
|
|
@ -2307,7 +2316,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSoftenProgram.mFeatures.hasGamma = true;
|
||||
gDeferredSoftenProgram.mFeatures.isDeferred = true;
|
||||
gDeferredSoftenProgram.mFeatures.hasShadows = use_sun_shadow;
|
||||
gDeferredSoftenProgram.mFeatures.hasReflectionProbes = true;
|
||||
gDeferredSoftenProgram.mFeatures.hasReflectionProbes = mShaderLevel[SHADER_DEFERRED] > 2;
|
||||
|
||||
gDeferredSoftenProgram.clearPermutations();
|
||||
gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
|
|
@ -2315,6 +2324,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
|
||||
gDeferredSoftenProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
|
||||
if (use_sun_shadow)
|
||||
{
|
||||
gDeferredSoftenProgram.addPermutation("HAS_SUN_SHADOW", "1");
|
||||
}
|
||||
|
||||
if (ambient_kill)
|
||||
{
|
||||
gDeferredSoftenProgram.addPermutation("AMBIENT_KILL", "1");
|
||||
|
|
@ -2333,6 +2347,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
|
||||
{ //if using SSAO, take screen space light map into account as if shadows are enabled
|
||||
gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
|
||||
gDeferredSoftenProgram.addPermutation("HAS_SSAO", "1");
|
||||
}
|
||||
|
||||
success = gDeferredSoftenProgram.createShader(NULL, NULL);
|
||||
|
|
@ -2358,7 +2373,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSoftenWaterProgram.mFeatures.hasGamma = true;
|
||||
gDeferredSoftenWaterProgram.mFeatures.isDeferred = true;
|
||||
gDeferredSoftenWaterProgram.mFeatures.hasShadows = use_sun_shadow;
|
||||
gDeferredSoftenWaterProgram.mFeatures.hasReflectionProbes = true;
|
||||
gDeferredSoftenWaterProgram.mFeatures.hasReflectionProbes = mShaderLevel[SHADER_DEFERRED] > 2;
|
||||
|
||||
if (use_sun_shadow)
|
||||
{
|
||||
gDeferredSoftenWaterProgram.addPermutation("HAS_SUN_SHADOW", "1");
|
||||
}
|
||||
|
||||
if (ambient_kill)
|
||||
{
|
||||
|
|
@ -2373,6 +2393,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
if (local_light_kill)
|
||||
{
|
||||
gDeferredSoftenWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
|
||||
gDeferredSoftenWaterProgram.addPermutation("HAS_SSAO", "1");
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
|
||||
|
|
|
|||
|
|
@ -770,6 +770,7 @@ LLHUDParticlePartition::LLHUDParticlePartition(LLViewerRegion* regionp) :
|
|||
void LLParticlePartition::rebuildGeom(LLSpatialGroup* group)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_GPU_ZONE("particle vbo");
|
||||
if (group->isDead() || !group->hasState(LLSpatialGroup::GEOM_DIRTY))
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -370,6 +370,7 @@ bool LLPipeline::sRenderFrameTest = false;
|
|||
bool LLPipeline::sRenderAttachedLights = true;
|
||||
bool LLPipeline::sRenderAttachedParticles = true;
|
||||
bool LLPipeline::sRenderDeferred = false;
|
||||
bool LLPipeline::sRenderPBR = false;
|
||||
S32 LLPipeline::sVisibleLightCount = 0;
|
||||
bool LLPipeline::sRenderingHUDs;
|
||||
F32 LLPipeline::sDistortionWaterClipPlaneMargin = 1.0125f;
|
||||
|
|
@ -590,6 +591,7 @@ void LLPipeline::init()
|
|||
connectRefreshCachedSettingsSafe("UseOcclusion");
|
||||
connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders");
|
||||
connectRefreshCachedSettingsSafe("RenderDeferred");
|
||||
connectRefreshCachedSettingsSafe("RenderPBR");
|
||||
connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
|
||||
connectRefreshCachedSettingsSafe("RenderFSAASamples");
|
||||
connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
|
||||
|
|
@ -1146,6 +1148,7 @@ void LLPipeline::updateRenderDeferred()
|
|||
LLPipeline::sRenderBump &&
|
||||
WindLightUseAtmosShaders &&
|
||||
(bool) LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred");
|
||||
sRenderPBR = sRenderDeferred && gSavedSettings.getBOOL("RenderPBR");
|
||||
|
||||
exoPostProcess::instance().ExodusRenderPostUpdate(); // <FS:CR> Import Vignette from Exodus
|
||||
|
||||
|
|
@ -2760,6 +2763,7 @@ void LLPipeline::doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderT
|
|||
void LLPipeline::doOcclusion(LLCamera& camera)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
|
||||
LL_PROFILE_GPU_ZONE("doOcclusion");
|
||||
if (LLPipeline::sUseOcclusion > 1 && !LLSpatialPartition::sTeleportRequested &&
|
||||
(sCull->hasOcclusionGroups() || LLVOCachePartition::sNeedsOcclusionCheck))
|
||||
{
|
||||
|
|
@ -9980,7 +9984,7 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbri
|
|||
void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult& result, bool use_shader, bool use_occlusion, U32 target_width)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
|
||||
|
||||
LL_PROFILE_GPU_ZONE("renderShadow");
|
||||
//disable occlusion culling for shadow passes (save setting to restore later)
|
||||
S32 occlude = LLPipeline::sUseOcclusion;
|
||||
if (!use_occlusion)
|
||||
|
|
@ -10067,7 +10071,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
}
|
||||
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
|
||||
|
||||
LL_PROFILE_GPU_ZONE("shadow simple");
|
||||
gGL.getTexUnit(0)->disable();
|
||||
for (U32 i = 0; i < sizeof(types) / sizeof(U32); ++i)
|
||||
{
|
||||
|
|
@ -10100,7 +10104,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA);
|
||||
|
||||
LL_PROFILE_GPU_ZONE("shadow alpha");
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
bool rigged = i == 1;
|
||||
|
|
|
|||
|
|
@ -647,6 +647,7 @@ public:
|
|||
static bool sRenderAttachedLights;
|
||||
static bool sRenderAttachedParticles;
|
||||
static bool sRenderDeferred;
|
||||
static bool sRenderPBR;
|
||||
static S32 sVisibleLightCount;
|
||||
static bool sRenderingHUDs;
|
||||
static F32 sDistortionWaterClipPlaneMargin;
|
||||
|
|
|
|||
|
|
@ -320,6 +320,19 @@
|
|||
<check_box.commit_callback
|
||||
function="Pref.RenderOptionUpdate" />
|
||||
</check_box>
|
||||
<check_box
|
||||
control_name="RenderPBR"
|
||||
height="16"
|
||||
initial_value="true"
|
||||
label="Physically Based Rendering"
|
||||
layout="topleft"
|
||||
left_delta="0"
|
||||
name="UsePBRShaders"
|
||||
top_pad="1"
|
||||
width="256">
|
||||
<check_box.commit_callback
|
||||
function="Pref.RenderOptionUpdate" />
|
||||
</check_box>
|
||||
|
||||
<text
|
||||
type="string"
|
||||
|
|
|
|||
Loading…
Reference in New Issue