diff options
author | Dave Parks <davep@lindenlab.com> | 2022-09-22 17:27:18 -0500 |
---|---|---|
committer | Dave Parks <davep@lindenlab.com> | 2022-09-22 17:27:18 -0500 |
commit | e5d463ca200bdfa93b8c65e588d490c2f23e3918 (patch) | |
tree | f30bebb5091a9e1a8230a34bd4a2e6ae3e5f7987 /indra/newview | |
parent | 4697b7049c3557189e6242ac2a8b6a4c2c0588c7 (diff) |
SL-17705 Backwards compatibility pass. Support OpenGL pre-4.0 by disabling reflection probes and anti-aliasing. Get render parity with current release viewer when reflection probes are disabled.
Diffstat (limited to 'indra/newview')
23 files changed, 197 insertions, 610 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a1f5e90730..01271ddc28 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9647,7 +9647,7 @@ <key>RenderPBR</key> <map> <key>Comment</key> - <string>Use PBR rendering pipeline (Physically Based Rendering).</string> + <string>DEPRECATED - only true supported - Use PBR rendering pipeline (Physically Based Rendering).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -10328,7 +10328,7 @@ <key>RenderReflectionProbeDetail</key> <map> <key>Comment</key> - <string>Detail of reflections.</string> + <string>Detail of reflections. (-1 - Disabled, 0 - Static Only, 1 - Static + Dynamic, 2 - Realtime)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl index 5264b3b716..0e461b4004 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl @@ -73,12 +73,7 @@ void main() vary_position = pos.xyz; vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -#ifndef HAS_REFLECTION_PROBES - vec3 ref = reflect(pos.xyz, -norm); - vary_texcoord1 = transpose(normal_matrix) * ref.xyz; -#else vary_texcoord1 = norm; -#endif calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl b/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl index 73a70d8dc5..9e6c853015 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/genbrdflutF.glsl @@ -53,7 +53,7 @@ VARYING vec2 vary_uv; out vec4 outColor; -#define NUM_SAMPLES 1024 +#define NUM_SAMPLES 1024u const float PI = 3.1415926536; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl index 04be496292..3afa9fb435 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl @@ -99,8 +99,8 @@ vec3 scaleSoftClipFrag(vec3 l); void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist); float calcLegacyDistanceAttenuation(float distance, float falloff); float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv, - vec3 pos, vec3 norm, float glossiness, float envIntensity); +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, + vec3 pos, vec3 norm, float glossiness); // PBR interface vec3 pbrIbl(vec3 diffuseColor, @@ -212,8 +212,7 @@ void main() float gloss = 1.0 - perceptualRoughness; vec3 irradiance = vec3(0); vec3 radiance = vec3(0); - vec3 legacyenv = vec3(0); - sampleReflectionProbes(irradiance, radiance, legacyenv, pos.xyz, norm.xyz, gloss, 0.0); + sampleReflectionProbes(irradiance, radiance, pos.xyz, norm.xyz, gloss); irradiance = max(srgb_to_linear(amblit),irradiance) * ambocc*4.0; vec3 f0 = vec3(0.04); diff --git a/indra/newview/app_settings/shaders/class1/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/reflectionProbeF.glsl index 8f3e38b08b..4b79297aef 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/reflectionProbeF.glsl @@ -24,7 +24,14 @@ */ // fallback stub -- will be used if actual reflection probe shader failed to load (output pink so it's obvious) -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, + vec3 pos, vec3 norm, float glossiness) +{ + ambenv = vec3(1,0,1); + glossenv = vec3(1,0,1); +} + +void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, vec3 pos, vec3 norm, float glossiness, float envIntensity) { ambenv = vec3(1,0,1); @@ -34,11 +41,11 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 l void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm) { - color = vec3(1,0,1); + } void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity) { - color = vec3(1,0,1); + } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 918e119c31..4b34e55efd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -156,12 +156,6 @@ void main() } -// linear debuggables -//color.rgb = vec3(final_da); -//color.rgb = vec3(ambient); -//color.rgb = vec3(scol); -//color.rgb = diffuse_srgb.rgb; - // convert to linear as fullscreen lights need to sum in linear colorspace // and will be gamma (re)corrected downstream... diff --git a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl index 3d96fe25be..15d6b5a05d 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl @@ -23,455 +23,46 @@ * $/LicenseInfo$ */ -#extension GL_ARB_shader_texture_lod : enable +// Implementation for when reflection probes are disabled -#define FLT_MAX 3.402823466e+38 +uniform float minimumReflectionAmbiance; -#define REFMAP_COUNT 256 -#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider +uniform samplerCube environmentMap; -uniform samplerCubeArray reflectionProbes; - -layout (std140) 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; +vec3 srgb_to_linear(vec3 c); -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) +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, + vec3 pos, vec3 norm, float glossiness) { - //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; - } + ambenv = vec3(0,0,0); - return col; + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + vec3 env_vec = env_mat * refnormpersp; + glossenv = srgb_to_linear(textureCube(environmentMap, env_vec).rgb); } -vec3 sampleProbeAmbient(vec3 pos, vec3 dir, float lod) +void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, + vec3 pos, vec3 norm, float glossiness, float envIntensity) { - 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 - ); + ambenv = vec3(0,0,0); - col *= 0.333333; + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + vec3 env_vec = env_mat * refnormpersp; - return col*reflectionAmbiance; + legacyenv = textureCube(environmentMap, env_vec).rgb; + glossenv = legacyenv; } -// 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) +void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm) { - // 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) +void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity) { - 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; + color = mix(color.rgb, legacyenv, envIntensity); } - 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); - } - diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl index 67f1fc4c18..c0a1491446 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -55,13 +55,11 @@ 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, +void sampleReflectionProbesLegacy(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 @@ -87,35 +85,21 @@ void main() 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 + sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity); 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 = srgb_to_linear(color.rgb); frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index 07f50af7e3..27eb0b9888 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -64,12 +64,10 @@ 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, +void sampleReflectionProbesLegacy(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; @@ -326,27 +324,12 @@ void main() 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); + sampleReflectionProbesLegacy(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; @@ -368,37 +351,14 @@ void main() color += spec_contrib; -#ifdef HAS_REFLECTION_PROBES applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); -#endif } -#ifdef HAS_REFLECTION_PROBES + color = atmosFragLighting(color, additive, atten); 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 @@ -410,6 +370,8 @@ void main() final_specular.rgb = srgb_to_linear(final_specular.rgb); // SL-14035 + color = mix(color.rgb, srgb_to_linear(diffcol.rgb), diffuse.a); + #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) @@ -431,7 +393,6 @@ void main() al = temp.a; #endif - color = mix(color.rgb, srgb_to_linear(diffcol.rgb), diffuse.a); frag_color = vec4(color, al); #else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 463709de9e..beb0f6f2a6 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -23,8 +23,6 @@ * $/LicenseInfo$ */ -#extension GL_ARB_shader_texture_lod : enable - #define FLT_MAX 3.402823466e+38 #define REFMAP_COUNT 256 @@ -33,6 +31,8 @@ uniform samplerCubeArray reflectionProbes; uniform samplerCubeArray irradianceProbes; +vec3 linear_to_srgb(vec3 col); + layout (std140) uniform ReflectionProbes { // list of OBBs for user override probes @@ -520,7 +520,22 @@ vec3 brighten(vec3 c) } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, + vec3 pos, vec3 norm, float glossiness) +{ + // TODO - don't hard code lods + float reflection_lods = 7; + preProbeSample(pos); + + vec3 refnormpersp = reflect(pos.xyz, norm.xyz); + + ambenv = sampleProbeAmbient(pos, norm); + + float lod = (1.0-glossiness)*reflection_lods; + glossenv = sampleProbes(pos, normalize(refnormpersp), lod, 1.f); +} + +void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, vec3 pos, vec3 norm, float glossiness, float envIntensity) { // TODO - don't hard code lods @@ -531,16 +546,22 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 l ambenv = sampleProbeAmbient(pos, norm); - //if (glossiness > 0.0) + if (glossiness > 0.0) { float lod = (1.0-glossiness)*reflection_lods; glossenv = sampleProbes(pos, normalize(refnormpersp), lod, 1.f); + glossenv = linear_to_srgb(glossenv); } if (envIntensity > 0.0) { legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0, 1.f); + legacyenv = linear_to_srgb(legacyenv); } + + // legacy expects values in sRGB space for now + ambenv = linear_to_srgb(ambenv); + } void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm) @@ -555,7 +576,7 @@ void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 no void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity) { - vec3 reflected_color = legacyenv; //*0.5; //fudge darker + vec3 reflected_color = legacyenv; vec3 lookAt = normalize(pos); float fresnel = 1.0+dot(lookAt, norm.xyz); fresnel *= fresnel; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 5c049b6bd6..cfdbbdfe2c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -76,7 +76,9 @@ 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, +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, + vec3 pos, vec3 norm, float glossiness); +void sampleReflectionProbesLegacy(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); @@ -156,7 +158,7 @@ void main() float gloss = 1.0 - perceptualRoughness; vec3 irradiance = vec3(0); vec3 radiance = vec3(0); - sampleReflectionProbes(irradiance, radiance, legacyenv, pos.xyz, norm.xyz, gloss, 0.0); + sampleReflectionProbes(irradiance, radiance, pos.xyz, norm.xyz, gloss); irradiance = max(srgb_to_linear(amblit),irradiance) * ambocc*4.0; vec3 f0 = vec3(0.04); @@ -196,10 +198,8 @@ void main() //diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14035 - sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); - ambenv.rgb = linear_to_srgb(ambenv.rgb); - glossenv.rgb = linear_to_srgb(glossenv.rgb); - legacyenv.rgb = linear_to_srgb(legacyenv.rgb); + sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); + vec3 debug = legacyenv; amblit = max(ambenv, amblit); color.rgb = amblit*ambocc; @@ -227,16 +227,13 @@ void main() 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 (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS)) { color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a); + if (envIntensity > 0.0) + { // add environmentmap + applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity); + } color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a); } @@ -248,8 +245,6 @@ void main() // convert to linear as fullscreen lights need to sum in linear colorspace // and will be gamma (re)corrected downstream... - //color = ambenv; - //color.b = diffuse.a; frag_color.rgb = srgb_to_linear(color.rgb); } diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index cfee0ba529..cfcb623caf 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 37 +version 39 // The version number above should be incremented IF AND ONLY IF some // change has been made that is sufficiently important to justify // resetting the graphics preferences of all users to the recommended @@ -47,6 +47,7 @@ RenderMaxPartCount 1 8192 RenderObjectBump 1 1 RenderLocalLights 1 1 RenderReflectionDetail 1 4 +RenderReflectionProbeDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTransparentWater 1 1 @@ -90,12 +91,12 @@ RenderGlowResolutionPow 1 8 RenderLocalLights 1 0 RenderMaxPartCount 1 0 RenderReflectionDetail 1 0 +RenderReflectionProbeDetail 1 -1 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderVolumeLODFactor 1 1.125 -RenderPBR 1 0 RenderDeferredSSAO 1 0 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 @@ -116,12 +117,12 @@ RenderGlowResolutionPow 1 8 RenderMaxPartCount 1 2048 RenderLocalLights 1 1 RenderReflectionDetail 1 0 +RenderReflectionProbeDetail 1 -1 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 -RenderPBR 1 0 RenderDeferredSSAO 1 0 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 @@ -152,6 +153,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 0 // // Medium High Graphics Settings (deferred enabled) @@ -177,6 +179,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // High Graphics Settings (deferred + SSAO) @@ -202,6 +205,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // High Ultra Graphics Settings (deferred + SSAO + shadows) @@ -227,6 +231,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // Ultra graphics (REALLY PURTY!) @@ -252,6 +257,7 @@ RenderDeferredSSAO 1 1 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // Class Unknown Hardware (unknown) @@ -259,7 +265,6 @@ RenderFSAASamples 1 2 list Unknown RenderShadowDetail 1 0 RenderDeferredSSAO 1 0 -RenderPBR 1 0 RenderUseAdvancedAtmospherics 1 0 // @@ -281,7 +286,7 @@ RenderTerrainDetail 1 0 RenderReflectionDetail 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 -RenderPBR 1 0 +RenderReflectionProbeDetail 0 -1 list Intel RenderAnisotropic 1 0 @@ -293,5 +298,6 @@ RenderGLContextCoreProfile 1 0 list AMD RenderReflectionProbeCount 1 16 - - +list GL3 +RenderFSAASamples 0 0 +RenderReflectionProbeDetail 0 -1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index c224fd2a6c..79ce057c30 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -72,6 +72,7 @@ RenderFSAASamples 1 16 RenderMaxTextureIndex 1 16 RenderGLContextCoreProfile 1 1 RenderGLMultiThreaded 1 0 +RenderReflectionProbeDetail 1 2 // // Low Graphics Settings @@ -93,12 +94,12 @@ RenderTerrainLODFactor 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderVolumeLODFactor 1 0.5 -RenderPBR 1 0 RenderDeferredSSAO 1 0 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 0 +RenderReflectionProbeDetail 1 -1 // // Medium Low Graphics Settings @@ -119,12 +120,12 @@ RenderTerrainLODFactor 1 1.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 -RenderPBR 1 0 RenderDeferredSSAO 1 0 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 0 +RenderReflectionProbeDetail 1 -1 // // Medium Graphics Settings (standard) @@ -150,6 +151,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 0 // // Medium High Graphics Settings (deferred enabled) @@ -175,6 +177,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 0 // // High Graphics Settings (deferred + SSAO) @@ -200,6 +203,7 @@ RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // High Ultra Graphics Settings (deferred + SSAO + shadows) @@ -225,6 +229,7 @@ RenderShadowDetail 1 2 RenderUseAdvancedAtmospherics 1 0 WLSkyDetail 1 48 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // Ultra graphics (REALLY PURTY!) @@ -250,13 +255,13 @@ RenderDeferredSSAO 1 1 RenderUseAdvancedAtmospherics 1 0 RenderShadowDetail 1 2 RenderFSAASamples 1 2 +RenderReflectionProbeDetail 1 1 // // Class Unknown Hardware (unknown) // list Unknown RenderShadowDetail 1 0 -RenderPBR 1 0 RenderDeferredSSAO 1 0 RenderUseAdvancedAtmospherics 1 0 @@ -278,7 +283,6 @@ RenderLocalLights 1 0 RenderMaxPartCount 1 1024 RenderTerrainDetail 1 0 RenderReflectionDetail 0 0 -RenderPBR 1 0 RenderDeferredSSAO 0 0 RenderUseAdvancedAtmospherics 0 0 RenderShadowDetail 0 0 @@ -294,6 +298,6 @@ RenderAnisotropic 1 0 RenderLocalLights 1 0 RenderFSAASamples 1 0 -list OSX_10_6_8 -RenderDeferred 0 0 - +list GL3 +RenderFSAASamples 0 0 +RenderReflectionProbeDetail 0 -1 diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 33ac91f88b..235672b07a 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -465,10 +465,14 @@ void LLDrawPoolBump::beginFullbrightShiny() shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV); cube_map->setMatrix(1); - if (shader->mFeatures.hasReflectionProbes) + if (LLPipeline::sReflectionProbesEnabled) { gPipeline.bindReflectionProbes(*shader); } + else + { + gPipeline.setEnvMat(*shader); + } // 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 diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 2c770f6ab8..5817fdbfa0 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -651,14 +651,10 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("VRAMGT512"); } - -#if LL_DARWIN - const LLOSInfo& osInfo = LLOSInfo::instance(); - if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7) - { - maskFeatures("OSX_10_6_8"); - } -#endif + if (gGLManager.mGLVersion < 3.99f) + { + maskFeatures("GL3"); + } // now mask by gpu string // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 2aa1f06eaf..6108fe84d3 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -63,7 +63,7 @@ struct CompareProbeDistance // helper class to seed octree with probes void LLReflectionMapManager::update() { - if (!LLPipeline::sRenderPBR || gTeleportDisplay) + if (!LLPipeline::sReflectionProbesEnabled || gTeleportDisplay) { return; } @@ -130,8 +130,9 @@ void LLReflectionMapManager::update() } bool did_update = false; - - bool realtime = gSavedSettings.getS32("RenderReflectionProbeDetail") >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; + + static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1); + bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; LLReflectionMap* closestDynamic = nullptr; @@ -613,6 +614,11 @@ void LLReflectionMapManager::updateNeighbors(LLReflectionMap* probe) void LLReflectionMapManager::updateUniforms() { + if (!LLPipeline::sReflectionProbesEnabled) + { + return; + } + LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; // structure for packing uniform buffer object @@ -740,7 +746,11 @@ void LLReflectionMapManager::updateUniforms() void LLReflectionMapManager::setUniforms() { - llassert(LLPipeline::sRenderPBR); + if (!LLPipeline::sReflectionProbesEnabled) + { + return; + } + if (mUBO == 0) { updateUniforms(); diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 634fc39460..93e0f33177 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -708,6 +708,9 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force) shader->uniform1f(LLShaderMgr::SCENE_LIGHT_STRENGTH, mSceneLightStrength); LLColor4 ambient(getTotalAmbient()); + + gPipeline.adjustAmbient(this, ambient); + shader->uniform4fv(LLShaderMgr::AMBIENT, LLVector4(ambient.mV)); shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, getIsSunUp() ? 1 : 0); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 2413d7705a..8638dba1b0 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -434,7 +434,7 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue) return true; } -static bool handleRenderPBRChanged(const LLSD& newvalue) +static bool handleReflectionProbeDetailChanged(const LLSD& newvalue) { if (gPipeline.isInit()) { @@ -696,7 +696,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2)); gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2)); // DEPRECATED - gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2)); - gSavedSettings.getControl("RenderPBR")->getSignal()->connect(boost::bind(&handleRenderPBRChanged, _2)); + gSavedSettings.getControl("RenderReflectionProbeDetail")->getSignal()->connect(boost::bind(&handleReflectionProbeDetailChanged, _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)); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 63d9a03aba..d1e5c8bd28 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -902,6 +902,8 @@ std::string LLViewerShaderMgr::loadBasicShaders() ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1); } + bool has_reflection_probes = gSavedSettings.getS32("RenderReflectionProbeDetail") >= 0 && gGLManager.mGLVersion > 3.99f; + std::vector<S32> index_channels; index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); @@ -916,7 +918,7 @@ std::string LLViewerShaderMgr::loadBasicShaders() index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/deferredUtil.glsl", 1) ); index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/shadowUtil.glsl", 1) ); index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/aoUtil.glsl", 1) ); - index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/reflectionProbeF.glsl", llmax(mShaderLevel[SHADER_DEFERRED], 1)) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/reflectionProbeF.glsl", has_reflection_probes ? 3 : 2) ); index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightAlphaMaskNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) ); @@ -1448,12 +1450,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredMaterialProgram[i].mFeatures.hasAtmospherics = true; gDeferredMaterialProgram[i].mFeatures.hasGamma = true; gDeferredMaterialProgram[i].mFeatures.hasShadows = use_sun_shadow; - - if (mShaderLevel[SHADER_DEFERRED] > 2) - { - gDeferredMaterialProgram[i].mFeatures.hasReflectionProbes = true; - gDeferredMaterialProgram[i].addPermutation("HAS_REFLECTION_PROBES", "1"); - } + gDeferredMaterialProgram[i].mFeatures.hasReflectionProbes = true; if (has_skin) { @@ -1530,6 +1527,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredMaterialWaterProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1"); } + gDeferredMaterialWaterProgram[i].mFeatures.hasReflectionProbes = true; gDeferredMaterialWaterProgram[i].mFeatures.hasWaterFog = true; gDeferredMaterialWaterProgram[i].mFeatures.hasSrgb = true; gDeferredMaterialWaterProgram[i].mFeatures.encodesNormal = true; @@ -2229,11 +2227,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyV.glsl", GL_VERTEX_SHADER)); gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER)); gDeferredFullbrightShinyProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; - if (gDeferredFullbrightShinyProgram.mShaderLevel > 2) - { - gDeferredFullbrightShinyProgram.addPermutation("HAS_REFLECTION_PROBES", "1"); - gDeferredFullbrightShinyProgram.mFeatures.hasReflectionProbes = true; - } + gDeferredFullbrightShinyProgram.mFeatures.hasReflectionProbes = true; success = make_rigged_variant(gDeferredFullbrightShinyProgram, gDeferredSkinnedFullbrightShinyProgram); success = success && gDeferredFullbrightShinyProgram.createShader(NULL, NULL); llassert(success); @@ -2701,7 +2695,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() llassert(success); } - if (success) + if (success && gGLManager.mGLVersion > 3.9f) { gFXAAProgram.mName = "FXAA Shader"; gFXAAProgram.mFeatures.isDeferred = true; @@ -2858,7 +2852,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gNormalMapGenProgram.createShader(NULL, NULL); } - if (success && gGLManager.mHasCubeMapArray) + if (success) { gDeferredGenBrdfLutProgram.mName = "Brdf Gen Shader"; gDeferredGenBrdfLutProgram.mShaderFiles.clear(); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 177d712f4b..b14ceedac8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -355,6 +355,7 @@ bool LLPipeline::sRenderFrameTest = false; bool LLPipeline::sRenderAttachedLights = true; bool LLPipeline::sRenderAttachedParticles = true; bool LLPipeline::sRenderDeferred = false; +bool LLPipeline::sReflectionProbesEnabled = false; bool LLPipeline::sRenderPBR = false; S32 LLPipeline::sVisibleLightCount = 0; bool LLPipeline::sRenderingHUDs; @@ -371,11 +372,10 @@ void validate_framebuffer_object(); // target -- RenderTarget to add attachments to bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false) { - bool pbr = gSavedSettings.getBOOL("RenderPBR"); bool valid = true && target.addColorAttachment(GL_RGBA) // frag-data[1] specular OR PBR ORM && target.addColorAttachment(GL_RGB10_A2) // frag_data[2] normal+z+fogmask, See: class1\deferred\materialF.glsl & softenlight - && (pbr ? target.addColorAttachment(GL_RGBA) : true); // frag_data[3] PBR emissive + && target.addColorAttachment(GL_RGBA); // frag_data[3] PBR emissive return valid; } @@ -553,7 +553,6 @@ void LLPipeline::init() connectRefreshCachedSettingsSafe("UseOcclusion"); // DEPRECATED -- connectRefreshCachedSettingsSafe("WindLightUseAtmosShaders"); // DEPRECATED -- connectRefreshCachedSettingsSafe("RenderDeferred"); - connectRefreshCachedSettingsSafe("RenderPBR"); connectRefreshCachedSettingsSafe("RenderDeferredSunWash"); connectRefreshCachedSettingsSafe("RenderFSAASamples"); connectRefreshCachedSettingsSafe("RenderResolutionDivisor"); @@ -1033,12 +1032,10 @@ void LLPipeline::updateRenderBump() // static void LLPipeline::updateRenderDeferred() { - sRenderDeferred = !gUseWireframe && - RenderDeferred && - LLRenderTarget::sUseFBO && - LLPipeline::sRenderBump && - WindLightUseAtmosShaders; - sRenderPBR = sRenderDeferred && gSavedSettings.getBOOL("RenderPBR"); + sRenderDeferred = !gUseWireframe; + sRenderPBR = sRenderDeferred; + static LLCachedControl<S32> sProbeDetail(gSavedSettings, "RenderReflectionProbeDetail", -1); + sReflectionProbesEnabled = sProbeDetail >= 0 && gGLManager.mGLVersion > 3.99f; } // static @@ -6238,6 +6235,22 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) } } +void LLPipeline::adjustAmbient(const LLSettingsSky* sky, LLColor4& ambient) +{ + //bump ambient based on reflection probe ambiance of probes are disabled + // so sky settings that rely on probes for ambiance don't go completely dark + // on low end hardware + if (!LLPipeline::sReflectionProbesEnabled) + { + F32 ambiance = linearTosRGB(sky->getReflectionProbeAmbiance()); + + for (int i = 0; i < 3; ++i) + { + ambient.mV[i] = llmax(ambient.mV[i], ambiance); + } + } +} + void LLPipeline::setupHWLights(LLDrawPool* pool) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; @@ -6248,7 +6261,9 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) // Ambient LLColor4 ambient = psky->getTotalAmbient(); - gGL.setAmbientLightColor(ambient); + adjustAmbient(psky.get(), ambient); + + gGL.setAmbientLightColor(ambient); bool sun_up = environment.getIsSunUp(); bool moon_up = environment.getIsMoonUp(); @@ -9281,8 +9296,24 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) shader.unbind(); } +void LLPipeline::setEnvMat(LLGLSLShader& shader) +{ + F32* m = gGLModelView; + + F32 mat[] = { m[0], m[1], m[2], + m[4], m[5], m[6], + m[8], m[9], m[10] }; + + shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, TRUE, mat); +} + void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) { + if (!sReflectionProbesEnabled) + { + return; + } + S32 channel = shader.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); bool bound = false; if (channel > -1 && mReflectionMapManager.mTexture.notNull()) @@ -9302,13 +9333,7 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) { mReflectionMapManager.setUniforms(); - F32* m = gGLModelView; - - F32 mat[] = { m[0], m[1], m[2], - m[4], m[5], m[6], - m[8], m[9], m[10] }; - - shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, TRUE, mat); + setEnvMat(shader); } } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 5665469c1a..58857e4176 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -51,6 +51,7 @@ class LLVOAvatar; class LLVOPartGroup; class LLGLSLShader; class LLDrawPoolAlpha; +class LLSettingsSky; typedef enum e_avatar_skinning_method { @@ -297,9 +298,14 @@ public: void unbindDeferredShader(LLGLSLShader& shader); + // set env_mat parameter in given shader + void setEnvMat(LLGLSLShader& shader); + void bindReflectionProbes(LLGLSLShader& shader); void unbindReflectionProbes(LLGLSLShader& shader); + + void renderDeferredLighting(LLRenderTarget* light_target); void postDeferredGammaCorrect(LLRenderTarget* screen_target); @@ -326,6 +332,7 @@ public: S32 getLightCount() const { return mLights.size(); } void calcNearbyLights(LLCamera& camera); + void adjustAmbient(const LLSettingsSky* sky, LLColor4& ambient); void setupHWLights(LLDrawPool* pool); void setupAvatarLights(bool for_edit = false); void enableLights(U32 mask); @@ -640,6 +647,7 @@ public: static bool sRenderAttachedLights; static bool sRenderAttachedParticles; static bool sRenderDeferred; + static bool sReflectionProbesEnabled; static bool sRenderPBR; static S32 sVisibleLightCount; static bool sRenderingHUDs; diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index 97a87d56f4..6ff27ad50b 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -720,6 +720,10 @@ name="ReflectionDetial" width="150"> <combo_box.item + label="Disabled" + name="0" + value="-1"/> + <combo_box.item label="Static Only" name="0" value="0"/> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 908ddd32b5..38d364cf9a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -231,20 +231,6 @@ m </text> - <check_box - control_name="RenderPBR" - height="16" - initial_value="true" - label="Physically Based Rendering" - layout="topleft" - left="30" - name="UsePBRShaders" - top_delta="24" - width="256"> - <check_box.commit_callback - function="Pref.RenderOptionUpdate" /> - </check_box> - <slider control_name="IndirectMaxComplexity" tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll" |