From d36f73fecf09cb41edd70c09d641a5c2ebc17d3c Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Fri, 16 Dec 2016 09:51:32 -0500 Subject: [PATCH 1/6] Fix avatar cloth failing to work in deferred --- .../shaders/class1/deferred/avatarV.glsl | 78 ++++++++++++++++++- indra/newview/llviewershadermgr.cpp | 1 + 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index 1bd8fee7c9..b1f6d6a176 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -28,6 +28,7 @@ uniform mat4 projection_matrix; ATTRIBUTE vec3 position; ATTRIBUTE vec3 normal; ATTRIBUTE vec2 texcoord0; +ATTRIBUTE vec4 clothing; mat4 getSkinnedTransform(); @@ -36,6 +37,13 @@ ATTRIBUTE vec4 weight; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; +uniform vec4 gWindDir; +uniform vec4 gSinWaveParams; +uniform vec4 gGravity; + +const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients +const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2} + void main() { vary_texcoord0 = texcoord0; @@ -45,16 +53,78 @@ void main() 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); +#if AVATAR_CLOTH + //wind + vec4 windEffect; + windEffect = vec4(dot(norm, gWindDir.xyz)); + pos.x = dot(trans[2], pos_in); + windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015) + + windEffect.xyz; + windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3] + windEffect.w = windEffect.w*gWindDir.w; // modulate wind strength + + windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz + +vec3(gSinWaveParams.w); // use sin wave params to scale and offset input + + //reduce to period of 2 PI + vec4 temp1, temp0, temp2, offsetPos; + temp1.xyz = windEffect.xyz * gPiConstants.x; // change input as multiple of [0-2PI] to [0-1] + temp0.y = mod(temp1.x,1.0); + windEffect.x = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI] + temp1.z = temp1.z - gPiConstants.w; // shift normal oscillation by PI/2 + temp0.y = mod(temp1.z,1.0); + + windEffect.z = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI] + windEffect.xyz = windEffect.xyz + vec3(-3.141592); // offset to [-PI, PI] + + //calculate sinusoid + vec4 sinWave; + temp1 = windEffect*windEffect; + sinWave = -temp1 * gMinMaxConstants.w + + vec4(gMinMaxConstants.z); // y = -(x^2)/7! + 1/5! + sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y); // y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3! + sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x); // y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1 + sinWave = sinWave * windEffect; // y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1) + + // sinWave.x holds sin(norm . wind_direction) with primary frequency + // sinWave.y holds sin(norm . wind_direction) with secondary frequency + // sinWave.z hold cos(norm . wind_direction) with primary frequency + sinWave.xyz = sinWave.xyz * gWindDir.w + + vec3(windEffect.w); // multiply by wind strength in gWindDir.w [-wind, wind] + + // add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1] + temp1 = vec4(dot(norm, gGravity.xyz)); // how much is this normal facing in direction of gGravity? + temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0)); // clamp [-1, 1] to [-1, 0.2] + temp1 = temp1*vec4(1.5,0.0,0.0,0.0); // scale from [-1,0.2] to [-1.5, 0.3] + sinWave.x = sinWave.x + temp1.x; // add gGravity effect to sinwave (only primary frequency) + sinWave.xyz = sinWave.xyz * clothing.w; // modulate by clothing coverage + + sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape + offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement + temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation + offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+pos_in; // add to offset vertex position, and zero out effect from w + norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated) + + //renormalize normal (again) + norm = normalize(norm); + + pos.x = dot(trans[0], offsetPos); + pos.y = dot(trans[1], offsetPos); + pos.z = dot(trans[2], offsetPos); + pos.w = 1.0; +#else + 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; +#endif + vary_normal = norm; gl_Position = projection_matrix * pos; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index a8c0571d0b..eb3d9f0e08 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1882,6 +1882,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarProgram.mShaderFiles.clear(); gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarProgram.addPermutation("AVATAR_CLOTH", (mVertexShaderLevel[SHADER_AVATAR] == 3) ? "1" : "0"); gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAvatarProgram.createShader(NULL, NULL); } From 7589cd490e7d7ce3cfca48b8d95fa560e6f2965d Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Fri, 16 Dec 2016 09:52:04 -0500 Subject: [PATCH 2/6] Fix weird water glow on edge of land due to broken alpha value --- indra/newview/app_settings/shaders/class1/deferred/waterF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index a2b193de4d..782d8116cc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -197,7 +197,7 @@ void main() vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); - frag_data[0] = vec4(color.rgb, color); // diffuse + frag_data[0] = vec4(color.rgb, color.a); // diffuse frag_data[1] = vec4(0); // speccolor, spec frag_data[2] = vec4(encode_normal(screenspacewavef.xyz*0.5+0.5), 0.05, 0);// normalxy, 0, 0 } From 580e16094031c57832faaf935bf928f8e754489f Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Fri, 16 Dec 2016 09:52:17 -0500 Subject: [PATCH 3/6] Fix gamma in underwater --- .../app_settings/shaders/class1/deferred/underWaterF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl index 78f841c733..77edb136b4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -151,7 +151,7 @@ void main() vec4 fb = texture2D(screenTex, distort); - frag_data[0] = vec4(linear_to_srgb(fb.rgb), 1.0); // diffuse + 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 } From 14a2127034ec4dce2da9b9bb034f2fbc136a940e Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Fri, 16 Dec 2016 09:52:29 -0500 Subject: [PATCH 4/6] Fix fullbright fog failing --- .../shaders/class1/deferred/fullbrightF.glsl | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 830dc8af57..ad7c2a9e88 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -40,6 +40,8 @@ VARYING vec3 vary_position; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +vec3 fullbrightAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); vec3 srgb_to_linear(vec3 cs) { @@ -78,17 +80,6 @@ vec3 linear_to_srgb(vec3 cl) } -vec3 fullbrightAtmosTransportDeferred(vec3 light) -{ - return light; -} - -vec3 fullbrightScaleSoftClipDeferred(vec3 light) -{ - //soft clip effect: - return light; -} - #ifdef HAS_ALPHA_MASK uniform float minimum_alpha; #endif @@ -157,22 +148,16 @@ void main() #endif color.rgb *= vertex_color.rgb; - color.rgb = srgb_to_linear(color.rgb); - color.rgb = fullbrightAtmosTransportDeferred(color.rgb); - color.rgb = fullbrightScaleSoftClipDeferred(color.rgb); - - color.rgb = linear_to_srgb(color.rgb); + color.rgb = fullbrightAtmosTransport(color.rgb); + color.rgb = fullbrightScaleSoftClip(color.rgb); #ifdef WATER_FOG vec3 pos = vary_position; - vec4 fogged = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); - color.rgb = fogged.rgb; - color.a = fogged.a; + color = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); #else color.a = final_alpha; #endif - frag_color.rgb = color.rgb; - frag_color.a = color.a; + frag_color = color; } From 17baf01fe0b014b279f4addaa8bc63a96600e959 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Fri, 16 Dec 2016 09:52:44 -0500 Subject: [PATCH 5/6] Fix impostors failing to render with alpha correctly --- .../shaders/class1/deferred/alphaF.glsl | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 7e1556ecb5..0a34907fe6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -452,9 +452,6 @@ vec3 fullbrightScaleSoftClip(vec3 light) void main() { - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - vec4 pos = vec4(vary_position, 1.0); float shadow = 1.0; @@ -531,18 +528,14 @@ void main() #else vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); #endif - -#ifdef FOR_IMPOSTOR - vec4 color; - color.rgb = diff.rgb; - color.a = 1.0; - #ifdef USE_VERTEX_COLOR float final_alpha = diff.a * vertex_color.a; diff.rgb *= vertex_color.rgb; #else float final_alpha = diff.a; #endif +#ifdef FOR_IMPOSTOR + vec4 color = vec4(diff.rgb,final_alpha); // Insure we don't pollute depth with invis pixels in impostor rendering // @@ -551,14 +544,6 @@ void main() discard; } #else - -#ifdef USE_VERTEX_COLOR - float final_alpha = diff.a * vertex_color.a; - diff.rgb *= vertex_color.rgb; -#else - float final_alpha = diff.a; -#endif - vec4 gamma_diff = diff; diff.rgb = srgb_to_linear(diff.rgb); From 5aa14b9a4d5d77cfdbabf38d2578a5bf05bf2f2b Mon Sep 17 00:00:00 2001 From: Ansariel Date: Wed, 18 Jan 2017 11:13:08 +0100 Subject: [PATCH 6/6] Add Firestorm tags & stuff --- .../shaders/class1/deferred/alphaF.glsl | 24 ++++++++++++++ .../shaders/class1/deferred/avatarV.glsl | 10 ++++++ .../shaders/class1/deferred/fullbrightF.glsl | 31 +++++++++++++++++++ .../shaders/class1/deferred/underWaterF.glsl | 3 ++ .../shaders/class1/deferred/waterF.glsl | 3 ++ indra/newview/llviewershadermgr.cpp | 2 +- 6 files changed, 72 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 0a34907fe6..cea9fa4150 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -452,6 +452,11 @@ vec3 fullbrightScaleSoftClip(vec3 light) void main() { + // Fix impostors failing to render with alpha correctly + //vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; + //frag *= screen_res; + // + vec4 pos = vec4(vary_position, 1.0); float shadow = 1.0; @@ -528,14 +533,24 @@ void main() #else vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); #endif + +// Fix impostors failing to render with alpha correctly +//#ifdef FOR_IMPOSTOR +// vec4 color; +// color.rgb = diff.rgb; +// color.a = 1.0; +// + #ifdef USE_VERTEX_COLOR float final_alpha = diff.a * vertex_color.a; diff.rgb *= vertex_color.rgb; #else float final_alpha = diff.a; #endif +// Fix impostors failing to render with alpha correctly #ifdef FOR_IMPOSTOR vec4 color = vec4(diff.rgb,final_alpha); +// // Insure we don't pollute depth with invis pixels in impostor rendering // @@ -545,6 +560,15 @@ void main() } #else +// Fix impostors failing to render with alpha correctly +//#ifdef USE_VERTEX_COLOR +// float final_alpha = diff.a * vertex_color.a; +// diff.rgb *= vertex_color.rgb; +//#else +// float final_alpha = diff.a; +//#endif +// + vec4 gamma_diff = diff; diff.rgb = srgb_to_linear(diff.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index b1f6d6a176..d3b1c87084 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -37,12 +37,14 @@ ATTRIBUTE vec4 weight; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; +// Fix avatar cloth failing to work in deferred uniform vec4 gWindDir; uniform vec4 gSinWaveParams; uniform vec4 gGravity; const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2} +// void main() { @@ -53,12 +55,19 @@ void main() vec4 pos_in = vec4(position.xyz, 1.0); mat4 trans = getSkinnedTransform(); + // Fix avatar cloth failing to work in deferred + //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); +// Fix avatar cloth failing to work in deferred #if AVATAR_CLOTH //wind vec4 windEffect; @@ -124,6 +133,7 @@ void main() pos.z = dot(trans[2], pos_in); pos.w = 1.0; #endif +// vary_normal = norm; diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index ad7c2a9e88..9fe89bdf31 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -40,8 +40,10 @@ VARYING vec3 vary_position; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; +// Fix fullbright fog failing vec3 fullbrightAtmosTransport(vec3 light); vec3 fullbrightScaleSoftClip(vec3 light); +// vec3 srgb_to_linear(vec3 cs) { @@ -80,6 +82,19 @@ vec3 linear_to_srgb(vec3 cl) } +// Fix fullbright fog failing +//vec3 fullbrightAtmosTransportDeferred(vec3 light) +//{ +// return light; +//} + +//vec3 fullbrightScaleSoftClipDeferred(vec3 light) +//{ +// //soft clip effect: +// return light; +//} +// + #ifdef HAS_ALPHA_MASK uniform float minimum_alpha; #endif @@ -148,16 +163,32 @@ void main() #endif color.rgb *= vertex_color.rgb; + // Fix fullbright fog failing + //color.rgb = srgb_to_linear(color.rgb); + //color.rgb = fullbrightAtmosTransportDeferred(color.rgb); + //color.rgb = fullbrightScaleSoftClipDeferred(color.rgb); + + //color.rgb = linear_to_srgb(color.rgb); color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); + // #ifdef WATER_FOG vec3 pos = vary_position; + // Fix fullbright fog failing + //vec4 fogged = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); + //color.rgb = fogged.rgb; + //color.a = fogged.a; color = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); + // #else color.a = final_alpha; #endif + // Fix fullbright fog failing + //frag_color.rgb = color.rgb; + //frag_color.a = color.a; frag_color = color; + // } diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl index 77edb136b4..4362414e14 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -151,7 +151,10 @@ void main() vec4 fb = texture2D(screenTex, distort); + // Fix gamma in underwater + //frag_data[0] = vec4(linear_to_srgb(fb.rgb), 1.0); // diffuse 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 } diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 782d8116cc..c6475b10cb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -197,7 +197,10 @@ void main() vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); + // Fix weird water glow on edge of land due to broken alpha value + //frag_data[0] = vec4(color.rgb, color); // diffuse frag_data[0] = vec4(color.rgb, color.a); // diffuse + // frag_data[1] = vec4(0); // speccolor, spec frag_data[2] = vec4(encode_normal(screenspacewavef.xyz*0.5+0.5), 0.05, 0);// normalxy, 0, 0 } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index eb3d9f0e08..789f5dc8ec 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1882,7 +1882,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarProgram.mShaderFiles.clear(); gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB)); - gDeferredAvatarProgram.addPermutation("AVATAR_CLOTH", (mVertexShaderLevel[SHADER_AVATAR] == 3) ? "1" : "0"); + gDeferredAvatarProgram.addPermutation("AVATAR_CLOTH", (mVertexShaderLevel[SHADER_AVATAR] == 3) ? "1" : "0"); // Fix avatar cloth failing to work in deferred gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAvatarProgram.createShader(NULL, NULL); }