NORSPEC-311 fix alpha / opaque lighting diffs
parent
94abe75dea
commit
caefe0e74c
|
|
@ -8894,6 +8894,17 @@
|
|||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderDeferredDisplayGamma</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Gamma ramp exponent for final correction before display gamma.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.8</real>
|
||||
</map>
|
||||
<key>RenderGLCoreProfile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -136,6 +136,52 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if WATER_FOG
|
||||
uniform vec4 waterPlane;
|
||||
uniform vec4 waterFogColor;
|
||||
uniform float waterFogDensity;
|
||||
uniform float waterFogKS;
|
||||
|
||||
vec4 applyWaterFogDeferred(vec3 pos, vec4 color)
|
||||
{
|
||||
//normalize view vector
|
||||
vec3 view = normalize(pos);
|
||||
float es = -(dot(view, waterPlane.xyz));
|
||||
|
||||
//find intersection point with water plane and eye vector
|
||||
|
||||
//get eye depth
|
||||
float e0 = max(-waterPlane.w, 0.0);
|
||||
|
||||
vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
|
||||
|
||||
//get object depth
|
||||
float depth = length(pos - int_v);
|
||||
|
||||
//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);
|
||||
|
||||
color.rgb = color.rgb * D + kc.rgb * L;
|
||||
color.a = kc.a + color.a;
|
||||
|
||||
return color;
|
||||
}
|
||||
#endif
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs)
|
||||
{
|
||||
|
||||
|
|
@ -240,8 +286,9 @@ void main()
|
|||
vec4 gamma_diff = diff;
|
||||
|
||||
diff.rgb = srgb_to_linear(diff.rgb);
|
||||
|
||||
|
||||
#ifdef USE_VERTEX_COLOR
|
||||
diff.rgb *= vertex_color.rgb;
|
||||
float vertex_color_alpha = vertex_color.a;
|
||||
#else
|
||||
float vertex_color_alpha = 1.0;
|
||||
|
|
@ -266,6 +313,7 @@ void main()
|
|||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb = srgb_to_linear(color.rgb);
|
||||
|
||||
col = vec4(0,0,0,0);
|
||||
|
||||
#define LIGHT_LOOP(i) col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z);
|
||||
|
|
@ -281,7 +329,11 @@ void main()
|
|||
color.rgb += diff.rgb * vary_pointlight_col_linear * col.rgb;
|
||||
|
||||
color.rgb = linear_to_srgb(color.rgb);
|
||||
//color.rgb = vec3(1,0,1);
|
||||
|
||||
#if WATER_FOG
|
||||
color = applyWaterFogDeferred(pos.xyz, color);
|
||||
#endif
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,6 +61,52 @@ vec3 linear_to_srgb(vec3 cl)
|
|||
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
|
||||
}
|
||||
|
||||
#ifdef WATER_FOG
|
||||
uniform vec4 waterPlane;
|
||||
uniform vec4 waterFogColor;
|
||||
uniform float waterFogDensity;
|
||||
uniform float waterFogKS;
|
||||
|
||||
vec4 applyWaterFogDeferred(vec3 pos, vec4 color)
|
||||
{
|
||||
//normalize view vector
|
||||
vec3 view = normalize(pos);
|
||||
float es = -(dot(view, waterPlane.xyz));
|
||||
|
||||
//find intersection point with water plane and eye vector
|
||||
|
||||
//get eye depth
|
||||
float e0 = max(-waterPlane.w, 0.0);
|
||||
|
||||
vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
|
||||
|
||||
//get object depth
|
||||
float depth = length(pos - int_v);
|
||||
|
||||
//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);
|
||||
|
||||
color.rgb = color.rgb * D + kc.rgb * L;
|
||||
color.a = kc.a + color.a;
|
||||
|
||||
return color;
|
||||
}
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
|
||||
void main()
|
||||
|
|
@ -72,7 +118,7 @@ void main()
|
|||
#endif
|
||||
|
||||
float final_alpha = color.a * vertex_color.a;
|
||||
if (final_alpha < minimum_alpha)
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
|
@ -84,7 +130,12 @@ void main()
|
|||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb = linear_to_srgb(color.rgb);
|
||||
//color.rgb = vec3(1,0,1);
|
||||
|
||||
|
||||
#ifdef WATER_FOG
|
||||
color = applyWaterFogDeferred(pos, vec4(color));
|
||||
#endif
|
||||
|
||||
frag_color.rgb = color.rgb;
|
||||
frag_color.a = final_alpha;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,12 +35,63 @@ out vec4 frag_color;
|
|||
uniform sampler2D diffuseMap;
|
||||
#endif
|
||||
|
||||
VARYING vec3 vary_position;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
#if HAS_ALPHA_MASK
|
||||
uniform float minimum_alpha;
|
||||
#endif
|
||||
|
||||
#ifdef WATER_FOG
|
||||
uniform vec4 waterPlane;
|
||||
uniform vec4 waterFogColor;
|
||||
uniform float waterFogDensity;
|
||||
uniform float waterFogKS;
|
||||
|
||||
vec4 applyWaterFogDeferred(vec3 pos, vec4 color)
|
||||
{
|
||||
//normalize view vector
|
||||
vec3 view = normalize(pos);
|
||||
float es = -(dot(view, waterPlane.xyz));
|
||||
|
||||
//find intersection point with water plane and eye vector
|
||||
|
||||
//get eye depth
|
||||
float e0 = max(-waterPlane.w, 0.0);
|
||||
|
||||
vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
|
||||
|
||||
//get object depth
|
||||
float depth = length(pos - int_v);
|
||||
|
||||
//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);
|
||||
|
||||
color.rgb = color.rgb * D + kc.rgb * L;
|
||||
color.a = kc.a + color.a;
|
||||
|
||||
return color;
|
||||
}
|
||||
#endif
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs)
|
||||
{
|
||||
|
||||
|
|
@ -69,15 +120,31 @@ void main()
|
|||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
#endif
|
||||
|
||||
float final_alpha = color.a * vertex_color.a;
|
||||
|
||||
#if HAS_ALPHA_MASK
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
|
||||
color.rgb = srgb_to_linear(color.rgb);
|
||||
color.rgb *= vertex_color.rgb;
|
||||
color.rgb = srgb_to_linear(color.rgb);
|
||||
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
|
||||
color.rgb = linear_to_srgb(color.rgb);
|
||||
//color.rgb = vec3(1,0,1);
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec3 pos = vary_position;
|
||||
vec4 fogged = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha));
|
||||
color.rgb = fogged.rgb;
|
||||
color.a = fogged.a;
|
||||
#endif
|
||||
|
||||
frag_color.rgb = color.rgb;
|
||||
frag_color.a = color.a;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,6 +40,9 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
|
|||
vec3 scaleDownLight(vec3 light);
|
||||
vec3 scaleUpLight(vec3 light);
|
||||
|
||||
#if WATER_FOG
|
||||
VARYING vec3 vary_position;
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
|
@ -53,7 +56,11 @@ void main()
|
|||
passTextureIndex();
|
||||
|
||||
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
|
||||
|
||||
#if WATER_FOG
|
||||
vary_position = pos.xyz;
|
||||
#endif
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ vec3 linear_to_srgb(vec3 cl)
|
|||
void main()
|
||||
{
|
||||
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
|
||||
diff.rgb = linear_to_srgb(diff.rgb);
|
||||
diff.rgb = pow(diff.rgb,vec3(texture_gamma));
|
||||
frag_color = diff;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,11 +93,21 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
|
|||
|
||||
if (pass == 0)
|
||||
{
|
||||
simple_shader = &gDeferredAlphaProgram;
|
||||
fullbright_shader = &gObjectFullbrightProgram;
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gDeferredAlphaWaterProgram;
|
||||
fullbright_shader = &gDeferredFullbrightWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gDeferredAlphaProgram;
|
||||
fullbright_shader = &gDeferredFullbrightProgram;
|
||||
}
|
||||
|
||||
fullbright_shader->bind();
|
||||
fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
fullbright_shader->unbind();
|
||||
|
||||
//prime simple shader (loads shadow relevant uniforms)
|
||||
gPipeline.bindDeferredShader(*simple_shader);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,7 +111,14 @@ void LLDrawPoolGlow::render(S32 pass)
|
|||
|
||||
LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram;
|
||||
shader->bind();
|
||||
shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.f);
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
}
|
||||
else
|
||||
{
|
||||
shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.f);
|
||||
}
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
|
@ -536,7 +543,15 @@ void LLDrawPoolFullbright::prerender()
|
|||
|
||||
void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredFullbrightProgram.bind();
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
gDeferredFullbrightWaterProgram.bind();
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredFullbrightProgram.bind();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
|
||||
|
|
@ -550,7 +565,14 @@ void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
|
|||
|
||||
void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredFullbrightProgram.unbind();
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
gDeferredFullbrightWaterProgram.unbind();
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredFullbrightProgram.unbind();
|
||||
}
|
||||
LLRenderPass::endRenderPass(pass);
|
||||
}
|
||||
|
||||
|
|
@ -633,15 +655,17 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)
|
|||
}
|
||||
else
|
||||
{
|
||||
#if LL_DARWIN
|
||||
// the OS X 10.6.8 GeForce driver is a real POS
|
||||
// this is a work-around for NORSPEC-314
|
||||
gObjectFullbrightAlphaMaskProgram.bind();
|
||||
gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
#else
|
||||
gDeferredFullbrightAlphaMaskProgram.bind();
|
||||
gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
#endif
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.bind();
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredFullbrightAlphaMaskProgram.bind();
|
||||
gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -197,9 +197,12 @@ LLGLSLShader gDeferredShadowAlphaMaskProgram;
|
|||
LLGLSLShader gDeferredAvatarShadowProgram;
|
||||
LLGLSLShader gDeferredAttachmentShadowProgram;
|
||||
LLGLSLShader gDeferredAlphaProgram;
|
||||
LLGLSLShader gDeferredAlphaWaterProgram;
|
||||
LLGLSLShader gDeferredAvatarEyesProgram;
|
||||
LLGLSLShader gDeferredFullbrightProgram;
|
||||
LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredFullbrightWaterProgram;
|
||||
LLGLSLShader gDeferredFullbrightAlphaMaskWaterProgram;
|
||||
LLGLSLShader gDeferredEmissiveProgram;
|
||||
LLGLSLShader gDeferredPostProgram;
|
||||
LLGLSLShader gDeferredCoFProgram;
|
||||
|
|
@ -301,9 +304,12 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
|
|||
mShaderList.push_back(&gDeferredMaterialWaterProgram[9+LLMaterial::SHADER_COUNT]);
|
||||
mShaderList.push_back(&gDeferredMaterialWaterProgram[13+LLMaterial::SHADER_COUNT]);
|
||||
mShaderList.push_back(&gDeferredAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredAlphaWaterProgram);
|
||||
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightWaterProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightAlphaMaskWaterProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightShinyProgram);
|
||||
mShaderList.push_back(&gDeferredSkinnedFullbrightShinyProgram);
|
||||
mShaderList.push_back(&gDeferredSkinnedFullbrightProgram);
|
||||
|
|
@ -1145,8 +1151,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarProgram.unload();
|
||||
gDeferredAvatarAlphaProgram.unload();
|
||||
gDeferredAlphaProgram.unload();
|
||||
gDeferredAlphaWaterProgram.unload();
|
||||
gDeferredFullbrightProgram.unload();
|
||||
gDeferredFullbrightAlphaMaskProgram.unload();
|
||||
gDeferredFullbrightWaterProgram.unload();
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.unload();
|
||||
gDeferredEmissiveProgram.unload();
|
||||
gDeferredAvatarEyesProgram.unload();
|
||||
gDeferredPostProgram.unload();
|
||||
|
|
@ -1518,7 +1527,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredAlphaProgram.addPermutation("USE_INDEXED_TEX", "1");
|
||||
gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");
|
||||
//gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");
|
||||
gDeferredAlphaProgram.addPermutation("WATER_FOG", "0");
|
||||
gDeferredAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");
|
||||
gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
|
||||
|
|
@ -1529,6 +1539,42 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAlphaProgram.mFeatures.hasLighting = true;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredAlphaWaterProgram.mName = "Deferred Alpha Underwater Shader";
|
||||
gDeferredAlphaWaterProgram.mFeatures.atmosphericHelpers = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.calculatesLighting = false;
|
||||
gDeferredAlphaWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.hasGamma = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.hasLighting = false;
|
||||
gDeferredAlphaWaterProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
|
||||
{
|
||||
gDeferredAlphaWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
}
|
||||
else
|
||||
{ //shave off some texture units for shadow maps
|
||||
gDeferredAlphaWaterProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels - 6, 1);
|
||||
}
|
||||
gDeferredAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gDeferredAlphaWaterProgram.mShaderFiles.clear();
|
||||
gDeferredAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredAlphaWaterProgram.addPermutation("USE_INDEXED_TEX", "1");
|
||||
//gDeferredAlphaWaterProgram.addPermutation("USE_VERTEX_COLOR", "1");
|
||||
gDeferredAlphaWaterProgram.addPermutation("WATER_FOG", "1");
|
||||
gDeferredAlphaWaterProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");
|
||||
gDeferredAlphaWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
|
||||
success = gDeferredAlphaWaterProgram.createShader(NULL, NULL);
|
||||
|
||||
// Hack
|
||||
gDeferredAlphaWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gDeferredAlphaWaterProgram.mFeatures.hasLighting = true;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";
|
||||
|
|
@ -1559,18 +1605,52 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
|
||||
if (success)
|
||||
{
|
||||
gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Mask Shader";
|
||||
gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Masking Shader";
|
||||
gDeferredFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
|
||||
gDeferredFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;
|
||||
gDeferredFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredFullbrightAlphaMaskProgram.addPermutation("HAS_ALPHA_MASK","1");
|
||||
success = gDeferredFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredFullbrightWaterProgram.mName = "Deferred Fullbright Underwater Shader";
|
||||
gDeferredFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredFullbrightWaterProgram.mFeatures.hasGamma = true;
|
||||
gDeferredFullbrightWaterProgram.mFeatures.hasTransport = true;
|
||||
gDeferredFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredFullbrightWaterProgram.mShaderFiles.clear();
|
||||
gDeferredFullbrightWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredFullbrightWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gDeferredFullbrightWaterProgram.addPermutation("WATER_FOG","1");
|
||||
success = gDeferredFullbrightWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mName = "Deferred Fullbright Underwater Alpha Masking Shader";
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasGamma = true;
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasTransport = true;
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.clear();
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.addPermutation("HAS_ALPHA_MASK","1");
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.addPermutation("WATER_FOG","1");
|
||||
success = gDeferredFullbrightAlphaMaskWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredFullbrightShinyProgram.mName = "Deferred FullbrightShiny Shader";
|
||||
|
|
|
|||
|
|
@ -366,6 +366,9 @@ extern LLGLSLShader gDeferredAttachmentShadowProgram;
|
|||
extern LLGLSLShader gDeferredAlphaProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
|
||||
extern LLGLSLShader gDeferredAlphaWaterProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightWaterProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightAlphaMaskWaterProgram;
|
||||
extern LLGLSLShader gDeferredEmissiveProgram;
|
||||
extern LLGLSLShader gDeferredAvatarEyesProgram;
|
||||
extern LLGLSLShader gDeferredAvatarAlphaProgram;
|
||||
|
|
|
|||
|
|
@ -8831,9 +8831,9 @@ void LLPipeline::renderDeferredLighting()
|
|||
|
||||
gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight());
|
||||
|
||||
F32 gamma = 1.0/2.2;
|
||||
F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma);
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
|
||||
gGL.begin(LLRender::TRIANGLE_STRIP);
|
||||
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
|
||||
|
|
@ -9380,9 +9380,9 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)
|
|||
|
||||
gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, target->getWidth(), target->getHeight());
|
||||
|
||||
F32 gamma = 1.0/2.2;
|
||||
F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma);
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
|
||||
gGL.begin(LLRender::TRIANGLE_STRIP);
|
||||
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue