diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/skyF.glsl | 60 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/skyV.glsl | 6 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolwlsky.cpp | 5 | 
4 files changed, 53 insertions, 29 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f248fac2ee..a28ea7294c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9373,6 +9373,17 @@      <key>Value</key>      <real>0.0</real>    </map> +  <key>RenderHDRISplitScreen</key> +  <map> +    <key>Comment</key> +    <string>What percentage of screen to render using HDRI vs EEP sky.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>1.0</real> +  </map>    <key>RenderMaxOpenGLVersion</key>    <map>      <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 596e9321e8..785c748234 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -28,8 +28,10 @@ in vec3 vary_HazeColor;  in float vary_LightNormPosDot;  #ifdef HAS_HDRI -in vec3 vary_position; +in vec4 vary_position; +in vec3 vary_rel_pos;  uniform float sky_hdr_scale; +uniform float hdri_split_screen;  uniform mat3 env_mat;  uniform sampler2D environmentMap;  #endif @@ -81,33 +83,39 @@ vec3 halo22(float d)  void main()  { +    vec3 color;  #ifdef HAS_HDRI -    vec3 pos = normalize(vary_position); -    pos = env_mat * pos; -    vec2 texCoord = vec2(atan(pos.z, pos.x) + PI, acos(pos.y)) / vec2(2.0 * PI, PI); -    vec3 color = textureLod(environmentMap, texCoord.xy, 0).rgb * sky_hdr_scale; -    color = min(color, vec3(8192*8192*16)); // stupidly large value arrived at by binary search -- avoids framebuffer corruption from some HDRIs - -    frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_HAS_HDRI); -#else - -    // Potential Fill-rate optimization.  Add cloud calculation  -    // back in and output alpha of 0 (so that alpha culling kills  -    // the fragment) if the sky wouldn't show up because the clouds  -    // are fully opaque. - -    vec3 color = vary_HazeColor; - -    float  rel_pos_lightnorm = vary_LightNormPosDot; -    float optic_d = rel_pos_lightnorm; -    vec3  halo_22 = halo22(optic_d); -    color.rgb += rainbow(optic_d); -    color.rgb += halo_22; -    color.rgb *= 2.; -    color.rgb = clamp(color.rgb, vec3(0), vec3(5)); - -    frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_SKIP_ATMOS); +    vec3 frag_coord = vary_position.xyz/vary_position.w; +    if (-frag_coord.x > ((1.0-hdri_split_screen)*2.0-1.0)) +    { +        vec3 pos = normalize(vary_rel_pos); +        pos = env_mat * pos; +        vec2 texCoord = vec2(atan(pos.z, pos.x) + PI, acos(pos.y)) / vec2(2.0 * PI, PI); +        color = textureLod(environmentMap, texCoord.xy, 0).rgb * sky_hdr_scale; +        color = min(color, vec3(8192*8192*16)); // stupidly large value arrived at by binary search -- avoids framebuffer corruption from some HDRIs + +        frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_HAS_HDRI); +    } +    else  #endif +    { +        // Potential Fill-rate optimization.  Add cloud calculation  +        // back in and output alpha of 0 (so that alpha culling kills  +        // the fragment) if the sky wouldn't show up because the clouds  +        // are fully opaque. + +        color = vary_HazeColor; + +        float  rel_pos_lightnorm = vary_LightNormPosDot; +        float optic_d = rel_pos_lightnorm; +        vec3  halo_22 = halo22(optic_d); +        color.rgb += rainbow(optic_d); +        color.rgb += halo_22; +        color.rgb *= 2.; +        color.rgb = clamp(color.rgb, vec3(0), vec3(5)); + +        frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_SKIP_ATMOS); +    }      frag_data[0] = vec4(0);      frag_data[1] = vec4(0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index bbe9a5a838..e48f69dab5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -36,7 +36,8 @@ out vec3 vary_HazeColor;  out float vary_LightNormPosDot;  #ifdef HAS_HDRI -out vec3 vary_position; +out vec4 vary_position; +out vec3 vary_rel_pos;  #endif  // Inputs @@ -77,7 +78,8 @@ void main()      vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);  #ifdef HAS_HDRI -    vary_position = rel_pos; +    vary_rel_pos = rel_pos; +    vary_position = pos;  #endif      // Adj position vector to clamp altitude diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 303916110c..323ab5fc07 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -153,12 +153,15 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca              static LLCachedControl<F32> hdri_exposure(gSavedSettings, "RenderHDRIExposure", 0.0f);              static LLCachedControl<F32> hdri_rotation(gSavedSettings, "RenderHDRIRotation", 0.f); -             +            static LLCachedControl<F32> hdri_split(gSavedSettings, "RenderHDRISplitScreen", 1.f); +            static LLStaticHashedString hdri_split_screen("hdri_split_screen"); +              LLMatrix3 rot;              rot.setRot(0.f, hdri_rotation*DEG_TO_RAD, 0.f);              sky_shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, powf(2.f, hdri_exposure));              sky_shader->uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, GL_FALSE, (F32*) rot.mMatrix); +            sky_shader->uniform1f(hdri_split_screen, hdri_split);          }          else          { | 
