SL-18229 Fix for PBR materials on HUDs misbehaving. Incidental decruft.
parent
be9e4f186d
commit
a2647e953a
|
|
@ -86,7 +86,6 @@ LLShaderFeatures::LLShaderFeatures()
|
|||
, calculatesAtmospherics(false)
|
||||
, hasLighting(false)
|
||||
, isAlphaLighting(false)
|
||||
, isFullbright(false)
|
||||
, isSpecular(false)
|
||||
, hasWaterFog(false)
|
||||
, hasTransport(false)
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ public:
|
|||
bool calculatesAtmospherics;
|
||||
bool hasLighting; // implies no transport (it's possible to have neither though)
|
||||
bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
|
||||
bool isFullbright; // implies no lighting
|
||||
bool isSpecular;
|
||||
bool hasWaterFog; // implies no gamma
|
||||
bool hasTransport; // implies no lighting (it's possible to have neither though)
|
||||
|
|
|
|||
|
|
@ -380,82 +380,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
|||
}
|
||||
}
|
||||
}
|
||||
// NOTE order of shader object attaching is VERY IMPORTANT!!!
|
||||
else if (features->isFullbright)
|
||||
{
|
||||
|
||||
if (features->hasWaterFog)
|
||||
{
|
||||
if (features->disableTextureIndex)
|
||||
{
|
||||
if (features->hasAlphaMask)
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (!shader->attachFragmentObject("lighting/lightFullbrightWaterNonIndexedF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (features->hasAlphaMask)
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightWaterAlphaMaskF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (!shader->attachFragmentObject("lighting/lightFullbrightWaterF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (features->disableTextureIndex)
|
||||
{
|
||||
|
||||
if (features->hasAlphaMask)
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightNonIndexedAlphaMaskF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightNonIndexedF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (features->hasAlphaMask)
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightAlphaMaskF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!shader->attachFragmentObject("lighting/lightFullbrightF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (features->mIndexedTextureChannels <= 1)
|
||||
{
|
||||
if (!shader->attachVertexObject("objects/nonindexedTextureV.glsl"))
|
||||
|
|
|
|||
|
|
@ -23,10 +23,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define DIFFUSE_ALPHA_MODE_IGNORE 0
|
||||
#define DIFFUSE_ALPHA_MODE_BLEND 1
|
||||
#define DIFFUSE_ALPHA_MODE_MASK 2
|
||||
#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
|
||||
|
||||
#ifndef IS_HUD
|
||||
|
||||
// default alpha implementation
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
uniform mat4 modelview_matrix;
|
||||
|
|
@ -38,13 +38,12 @@ uniform mat4 modelview_projection_matrix;
|
|||
#endif
|
||||
uniform mat4 texture_matrix0;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
#if !defined(HAS_SKIN)
|
||||
uniform mat4 modelview_matrix;
|
||||
#endif
|
||||
VARYING vec3 vary_position;
|
||||
#if !defined(HAS_SKIN)
|
||||
uniform mat4 modelview_matrix;
|
||||
#endif
|
||||
|
||||
out vec3 vary_position;
|
||||
|
||||
uniform mat3 texture_basecolor_matrix;
|
||||
uniform mat3 texture_normal_matrix;
|
||||
uniform mat3 texture_metallic_roughness_matrix;
|
||||
|
|
@ -79,9 +78,7 @@ void main()
|
|||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec3 pos = (mat*vec4(position.xyz,1.0)).xyz;
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
vary_position = pos;
|
||||
#endif
|
||||
vec4 vert = projection_matrix * vec4(pos,1.0);
|
||||
#else
|
||||
//transform vertex
|
||||
|
|
@ -112,9 +109,45 @@ void main()
|
|||
|
||||
vertex_color = diffuse_color;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
#if !defined(HAS_SKIN)
|
||||
#if !defined(HAS_SKIN)
|
||||
vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// fullbright HUD alpha implementation
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
|
||||
uniform mat4 modelview_matrix;
|
||||
|
||||
out vec3 vary_position;
|
||||
|
||||
uniform mat3 texture_basecolor_matrix;
|
||||
uniform mat3 texture_emissive_matrix;
|
||||
|
||||
in vec3 position;
|
||||
in vec4 diffuse_color;
|
||||
in vec2 texcoord0;
|
||||
|
||||
out vec2 basecolor_texcoord;
|
||||
out vec2 emissive_texcoord;
|
||||
|
||||
out vec4 vertex_color;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
gl_Position = vert;
|
||||
|
||||
basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
|
||||
emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
|
||||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@
|
|||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
|
||||
#ifndef IS_HUD
|
||||
|
||||
// deferred opaque implementation
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
|
||||
uniform float metallicFactor;
|
||||
|
|
@ -101,3 +106,47 @@ void main()
|
|||
frag_data[2] = vec4(encode_normal(tnorm), vertex_color.a, GBUFFER_FLAG_HAS_PBR); // normal, environment intensity, flags
|
||||
frag_data[3] = vec4(emissive,0); // PBR sRGB Emissive
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// forward fullbright implementation for HUDs
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
|
||||
uniform vec3 emissiveColor;
|
||||
uniform sampler2D emissiveMap;
|
||||
|
||||
out vec4 frag_color;
|
||||
|
||||
in vec3 vary_position;
|
||||
in vec4 vertex_color;
|
||||
|
||||
in vec2 basecolor_texcoord;
|
||||
in vec2 emissive_texcoord;
|
||||
|
||||
uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
|
||||
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba;
|
||||
if (basecolor.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec3 col = vertex_color.rgb * srgb_to_linear(basecolor.rgb);
|
||||
|
||||
vec3 emissive = emissiveColor;
|
||||
emissive *= srgb_to_linear(texture2D(emissiveMap, emissive_texcoord.xy).rgb);
|
||||
|
||||
col += emissive;
|
||||
|
||||
// HUDs are rendered after gamma correction, output in sRGB space
|
||||
frag_color.rgb = linear_to_srgb(col);
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -23,10 +23,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define DIFFUSE_ALPHA_MODE_IGNORE 0
|
||||
#define DIFFUSE_ALPHA_MODE_BLEND 1
|
||||
#define DIFFUSE_ALPHA_MODE_MASK 2
|
||||
#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
|
||||
|
||||
#ifndef IS_HUD
|
||||
|
||||
//deferred opaque implementation
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
uniform mat4 modelview_matrix;
|
||||
|
|
@ -95,3 +95,40 @@ void main()
|
|||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// fullbright HUD implementation
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
|
||||
uniform mat3 texture_basecolor_matrix;
|
||||
uniform mat3 texture_normal_matrix;
|
||||
uniform mat3 texture_metallic_roughness_matrix;
|
||||
uniform mat3 texture_emissive_matrix;
|
||||
|
||||
in vec3 position;
|
||||
in vec4 diffuse_color;
|
||||
in vec2 texcoord0;
|
||||
|
||||
out vec2 basecolor_texcoord;
|
||||
out vec2 emissive_texcoord;
|
||||
|
||||
out vec4 vertex_color;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
basecolor_texcoord = (texture_matrix0 * vec4(texture_basecolor_matrix * vec3(texcoord0,1), 1)).xy;
|
||||
emissive_texcoord = (texture_matrix0 * vec4(texture_emissive_matrix * vec3(texcoord0,1), 1)).xy;
|
||||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightAlphaMaskF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float texture_gamma; // either 1.0 or 2.2; see: "::TEXTURE_GAMMA"
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color *= vertex_color;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
uniform float texture_gamma;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
|
||||
|
||||
frag_color = color;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightNonIndexedAlphaMaskF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float texture_gamma;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightWaterAlphaMaskF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
|
||||
/* vec4 diffuseLookup(vec2 texcoord); */
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec4 applyWaterFog(vec4 color);
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
}
|
||||
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightWaterF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
/* vec4 diffuseLookup(vec2 texcoord); */
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec4 applyWaterFog(vec4 color);
|
||||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
}
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightWaterNonIndexedAlphaMaskF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec4 applyWaterFog(vec4 color);
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
}
|
||||
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/**
|
||||
* @file class1\lighting\lightFullbrightWaterF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec4 applyWaterFog(vec4 color);
|
||||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
}
|
||||
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/**
|
||||
* @file objects/fullbrightF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$F
|
||||
*/
|
||||
|
||||
|
||||
|
||||
void fullbright_lighting();
|
||||
|
||||
void main()
|
||||
{
|
||||
fullbright_lighting();
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
/**
|
||||
* @file fullbrightV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
void passTextureIndex();
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
mat4 getObjectSkinnedTransform();
|
||||
uniform mat4 projection_matrix;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz,1.0);
|
||||
passTextureIndex();
|
||||
#ifdef HAS_SKIN
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec4 pos = mat * vert;
|
||||
gl_Position = projection_matrix * pos;
|
||||
#else
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
#endif
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifndef IS_HUD
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
uniform sampler2D bumpMap;
|
||||
uniform sampler2D emissiveMap;
|
||||
|
|
@ -249,3 +251,59 @@ void main()
|
|||
a += f;
|
||||
frag_color = vec4(color.rgb,a);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
uniform sampler2D emissiveMap;
|
||||
|
||||
uniform vec3 emissiveColor;
|
||||
|
||||
out vec4 frag_color;
|
||||
|
||||
in vec3 vary_position;
|
||||
|
||||
in vec2 basecolor_texcoord;
|
||||
in vec2 emissive_texcoord;
|
||||
|
||||
in vec4 vertex_color;
|
||||
|
||||
#ifdef HAS_ALPHA_MASK
|
||||
uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
|
||||
#endif
|
||||
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 color = vec3(0,0,0);
|
||||
|
||||
vec3 pos = vary_position;
|
||||
|
||||
vec4 basecolor = texture(diffuseMap, basecolor_texcoord.xy).rgba;
|
||||
basecolor.rgb = srgb_to_linear(basecolor.rgb);
|
||||
#ifdef HAS_ALPHA_MASK
|
||||
if (basecolor.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
|
||||
color = vertex_color.rgb * basecolor.rgb;
|
||||
|
||||
// emissiveColor is the emissive color factor from GLTF and is already in linear space
|
||||
vec3 colorEmissive = emissiveColor;
|
||||
// emissiveMap here is a vanilla RGB texture encoded as sRGB, manually convert to linear
|
||||
colorEmissive *= srgb_to_linear(texture2D(emissiveMap, emissive_texcoord.xy).rgb);
|
||||
|
||||
|
||||
float a = basecolor.a*vertex_color.a;
|
||||
a = 1.0;
|
||||
color += colorEmissive;
|
||||
color = linear_to_srgb(color);
|
||||
frag_color = vec4(color.rgb,a);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -199,7 +199,9 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
|
|||
prepare_alpha_shader(&materialShader[i], false, true, water_sign);
|
||||
}
|
||||
|
||||
prepare_alpha_shader(&gDeferredPBRAlphaProgram, false, true, water_sign);
|
||||
pbr_shader = LLPipeline::sRenderingHUDs ? &gHUDPBRAlphaProgram : &gDeferredPBRAlphaProgram;
|
||||
|
||||
prepare_alpha_shader(pbr_shader, false, true, water_sign);
|
||||
|
||||
if (!LLPipeline::sRenderingHUDs)
|
||||
{
|
||||
|
|
@ -211,10 +213,10 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
|
|||
forwardRender();
|
||||
|
||||
// final pass, render to depth for depth of field effects
|
||||
if (!LLPipeline::sImpostorRender && gSavedSettings.getBOOL("RenderDepthOfField") && !gCubeSnapshot)
|
||||
if (!LLPipeline::sImpostorRender && gSavedSettings.getBOOL("RenderDepthOfField") && !gCubeSnapshot && !LLPipeline::sRenderingHUDs)
|
||||
{
|
||||
//update depth buffer sampler
|
||||
simple_shader = fullbright_shader = &gObjectFullbrightAlphaMaskProgram;
|
||||
simple_shader = fullbright_shader = &gDeferredFullbrightAlphaMaskProgram;
|
||||
|
||||
simple_shader->bind();
|
||||
simple_shader->setMinimumAlpha(0.33f);
|
||||
|
|
@ -630,7 +632,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, bool depth_only, bool rigged)
|
|||
|
||||
if (gltf_mat && gltf_mat->mAlphaMode == LLGLTFMaterial::ALPHA_MODE_BLEND)
|
||||
{
|
||||
target_shader = &gDeferredPBRAlphaProgram;
|
||||
target_shader = pbr_shader;
|
||||
if (params.mAvatar != nullptr)
|
||||
{
|
||||
target_shader = target_shader->mRiggedVariant;
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ private:
|
|||
LLGLSLShader* simple_shader = nullptr;
|
||||
LLGLSLShader* fullbright_shader = nullptr;
|
||||
LLGLSLShader* emissive_shader = nullptr;
|
||||
LLGLSLShader* pbr_shader = nullptr;
|
||||
|
||||
void drawEmissive(U32 mask, LLDrawInfo* draw);
|
||||
void renderEmissives(U32 mask, std::vector<LLDrawInfo*>& emissives);
|
||||
|
|
|
|||
|
|
@ -31,22 +31,46 @@
|
|||
#include "llviewershadermgr.h"
|
||||
#include "pipeline.h"
|
||||
|
||||
static const U32 gltf_render_types[] = { LLPipeline::RENDER_TYPE_PASS_GLTF_PBR, LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_ALPHA_MASK };
|
||||
|
||||
LLDrawPoolGLTFPBR::LLDrawPoolGLTFPBR() :
|
||||
LLRenderPass(POOL_GLTF_PBR)
|
||||
{
|
||||
}
|
||||
|
||||
S32 LLDrawPoolGLTFPBR::getNumDeferredPasses()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void LLDrawPoolGLTFPBR::renderDeferred(S32 pass)
|
||||
{
|
||||
const U32 types[] = { LLPipeline::RENDER_TYPE_PASS_GLTF_PBR, LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_ALPHA_MASK };
|
||||
llassert(!LLPipeline::sRenderingHUDs);
|
||||
|
||||
for (U32 type : types)
|
||||
for (U32 type : gltf_render_types)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bind();
|
||||
pushGLTFBatches(type);
|
||||
|
||||
|
||||
gDeferredPBROpaqueProgram.bind(true);
|
||||
pushRiggedGLTFBatches(type+1);
|
||||
pushRiggedGLTFBatches(type + 1);
|
||||
}
|
||||
}
|
||||
|
||||
S32 LLDrawPoolGLTFPBR::getNumPostDeferredPasses()
|
||||
{
|
||||
return LLPipeline::sRenderingHUDs ? 1 : 0;
|
||||
}
|
||||
|
||||
void LLDrawPoolGLTFPBR::renderPostDeferred(S32 pass)
|
||||
{
|
||||
// only HUD rendering should execute this pass
|
||||
llassert(LLPipeline::sRenderingHUDs);
|
||||
|
||||
gHUDPBROpaqueProgram.bind();
|
||||
for (U32 type : gltf_render_types)
|
||||
{
|
||||
pushGLTFBatches(type);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,8 +48,11 @@ public:
|
|||
|
||||
LLDrawPoolGLTFPBR();
|
||||
|
||||
S32 getNumDeferredPasses() override { return 1; }
|
||||
S32 getNumDeferredPasses() override;
|
||||
void renderDeferred(S32 pass) override;
|
||||
|
||||
S32 getNumPostDeferredPasses() override;
|
||||
void renderPostDeferred(S32 pass) override;
|
||||
};
|
||||
|
||||
#endif // LL_LLDRAWPOOLPBROPAQUE_H
|
||||
|
|
|
|||
|
|
@ -1161,6 +1161,7 @@ void render_hud_attachments()
|
|||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_ALPHA_MASK);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_FULLBRIGHT);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_GLTF_PBR);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_ALPHA);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_BUMP);
|
||||
|
|
@ -1171,6 +1172,8 @@ void render_hud_attachments()
|
|||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_SHINY);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_INVISIBLE);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_GLTF_PBR);
|
||||
gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_ALPHA_MASK);
|
||||
|
||||
gPipeline.stateSort(hud_cam, result);
|
||||
|
||||
|
|
|
|||
|
|
@ -205,8 +205,10 @@ LLGLSLShader gDeferredGenBrdfLutProgram;
|
|||
// Deferred materials shaders
|
||||
LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
|
||||
LLGLSLShader gDeferredMaterialWaterProgram[LLMaterial::SHADER_COUNT*2];
|
||||
LLGLSLShader gHUDPBROpaqueProgram;
|
||||
LLGLSLShader gDeferredPBROpaqueProgram;
|
||||
LLGLSLShader gDeferredSkinnedPBROpaqueProgram;
|
||||
LLGLSLShader gHUDPBRAlphaProgram;
|
||||
LLGLSLShader gDeferredPBRAlphaProgram;
|
||||
LLGLSLShader gDeferredSkinnedPBRAlphaProgram;
|
||||
|
||||
|
|
@ -284,6 +286,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
|
|||
mShaderList.push_back(&gDeferredWLMoonProgram);
|
||||
mShaderList.push_back(&gDeferredWLSunProgram);
|
||||
mShaderList.push_back(&gDeferredPBRAlphaProgram);
|
||||
mShaderList.push_back(&gHUDPBRAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredSkinnedPBRAlphaProgram);
|
||||
|
||||
}
|
||||
|
|
@ -555,7 +558,6 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
gImpostorProgram.unload();
|
||||
gObjectBumpProgram.unload();
|
||||
gSkinnedObjectBumpProgram.unload();
|
||||
gObjectFullbrightAlphaMaskProgram.unload();
|
||||
gSkinnedObjectFullbrightAlphaMaskProgram.unload();
|
||||
|
||||
gObjectAlphaMaskNoColorProgram.unload();
|
||||
|
|
@ -738,21 +740,13 @@ std::string LLViewerShaderMgr::loadBasicShaders()
|
|||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/screenSpaceReflUtil.glsl", ssr ? 3 : 1) );
|
||||
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] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterAlphaMaskF.glsl", mShaderLevel[SHADER_LIGHTING] ) );
|
||||
|
||||
|
||||
for (U32 i = 0; i < shaders.size(); i++)
|
||||
{
|
||||
// Note usage of GL_FRAGMENT_SHADER
|
||||
|
|
@ -1021,6 +1015,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredMaterialWaterProgram[i].unload();
|
||||
}
|
||||
|
||||
gHUDPBROpaqueProgram.unload();
|
||||
gDeferredPBROpaqueProgram.unload();
|
||||
gDeferredSkinnedPBROpaqueProgram.unload();
|
||||
gDeferredPBRAlphaProgram.unload();
|
||||
|
|
@ -1321,11 +1316,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredPBROpaqueProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredPBROpaqueProgram.addPermutation("HAS_NORMAL_MAP", "1");
|
||||
gDeferredPBROpaqueProgram.addPermutation("HAS_SPECULAR_MAP", "1");
|
||||
gDeferredPBROpaqueProgram.addPermutation("HAS_EMISSIVE_MAP", "1");
|
||||
gDeferredPBROpaqueProgram.addPermutation("DIFFUSE_ALPHA_MODE", "0");
|
||||
|
||||
|
||||
success = make_rigged_variant(gDeferredPBROpaqueProgram, gDeferredSkinnedPBROpaqueProgram);
|
||||
if (success)
|
||||
{
|
||||
|
|
@ -1334,6 +1325,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gHUDPBROpaqueProgram.mName = "HUD PBR Opaque Shader";
|
||||
gHUDPBROpaqueProgram.mFeatures.hasSrgb = true;
|
||||
gHUDPBROpaqueProgram.mShaderFiles.clear();
|
||||
gHUDPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueV.glsl", GL_VERTEX_SHADER));
|
||||
gHUDPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueF.glsl", GL_FRAGMENT_SHADER));
|
||||
gHUDPBROpaqueProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gHUDPBROpaqueProgram.clearPermutations();
|
||||
gHUDPBROpaqueProgram.addPermutation("IS_HUD", "1");
|
||||
|
||||
success = gHUDPBROpaqueProgram.createShader(NULL, NULL);
|
||||
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
LLGLSLShader* shader = &gDeferredPBRAlphaProgram;
|
||||
|
|
@ -1370,21 +1377,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
shader->addPermutation("HAS_SUN_SHADOW", "1");
|
||||
}
|
||||
|
||||
if (ambient_kill)
|
||||
{
|
||||
shader->addPermutation("AMBIENT_KILL", "1");
|
||||
}
|
||||
|
||||
if (sunlight_kill)
|
||||
{
|
||||
shader->addPermutation("SUNLIGHT_KILL", "1");
|
||||
}
|
||||
|
||||
if (local_light_kill)
|
||||
{
|
||||
shader->addPermutation("LOCAL_LIGHT_KILL", "1");
|
||||
}
|
||||
|
||||
shader->mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = make_rigged_variant(*shader, gDeferredSkinnedPBRAlphaProgram);
|
||||
if (success)
|
||||
|
|
@ -1402,6 +1394,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
shader->mRiggedVariant->mFeatures.hasLighting = true;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
LLGLSLShader* shader = &gHUDPBRAlphaProgram;
|
||||
shader->mName = "HUD PBR Alpha Shader";
|
||||
|
||||
shader->mFeatures.hasSrgb = true;
|
||||
|
||||
shader->mShaderFiles.clear();
|
||||
shader->mShaderFiles.push_back(make_pair("deferred/pbralphaV.glsl", GL_VERTEX_SHADER));
|
||||
shader->mShaderFiles.push_back(make_pair("deferred/pbralphaF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
||||
shader->clearPermutations();
|
||||
|
||||
shader->addPermutation("IS_HUD", "1");
|
||||
|
||||
shader->mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = shader->createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
|
|
@ -2593,7 +2604,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredWLSunProgram.mFeatures.hasTransport = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasGamma = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredWLSunProgram.mFeatures.isFullbright = true;
|
||||
gDeferredWLSunProgram.mFeatures.disableTextureIndex = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredWLSunProgram.mShaderFiles.clear();
|
||||
|
|
@ -2613,7 +2623,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredWLMoonProgram.mFeatures.hasGamma = true;
|
||||
gDeferredWLMoonProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredWLMoonProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredWLMoonProgram.mFeatures.isFullbright = true;
|
||||
gDeferredWLMoonProgram.mFeatures.disableTextureIndex = true;
|
||||
|
||||
gDeferredWLMoonProgram.mShaderFiles.clear();
|
||||
|
|
@ -2785,24 +2794,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
|||
gPhysicsPreviewProgram.mFeatures.hasLighting = false;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightAlphaMaskProgram.mName = "Fullbright Alpha Mask Shader";
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasSrgb = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER));
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER));
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_OBJECT];
|
||||
success = make_rigged_variant(gObjectFullbrightAlphaMaskProgram, gSkinnedObjectFullbrightAlphaMaskProgram);
|
||||
success = success && gObjectFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
mShaderLevel[SHADER_OBJECT] = 0;
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@ extern LLGLSLShader gOneTextureFilterProgram;
|
|||
//object shaders
|
||||
extern LLGLSLShader gObjectPreviewProgram;
|
||||
extern LLGLSLShader gPhysicsPreviewProgram;
|
||||
extern LLGLSLShader gObjectFullbrightAlphaMaskProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectBumpProgram;
|
||||
extern LLGLSLShader gSkinnedObjectBumpProgram;
|
||||
|
|
@ -268,6 +267,8 @@ extern LLGLSLShader gDeferredGenBrdfLutProgram;
|
|||
extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
|
||||
extern LLGLSLShader gDeferredMaterialWaterProgram[LLMaterial::SHADER_COUNT*2];
|
||||
|
||||
extern LLGLSLShader gHUDPBROpaqueProgram;
|
||||
extern LLGLSLShader gDeferredPBROpaqueProgram;
|
||||
extern LLGLSLShader gDeferredPBRAlphaProgram;
|
||||
extern LLGLSLShader gHUDPBRAlphaProgram;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -5306,33 +5306,35 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
}
|
||||
}
|
||||
|
||||
if (idx >= 0 &&
|
||||
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
|
||||
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
|
||||
LLDrawInfo* info = idx >= 0 ? draw_vec[idx] : nullptr;
|
||||
|
||||
if (info &&
|
||||
info->mVertexBuffer == facep->getVertexBuffer() &&
|
||||
info->mEnd == facep->getGeomIndex()-1 &&
|
||||
(LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex || batchable) &&
|
||||
#if LL_DARWIN
|
||||
draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
|
||||
draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
|
||||
info->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
|
||||
info->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
|
||||
#endif
|
||||
draw_vec[idx]->mMaterialID == mat_id &&
|
||||
draw_vec[idx]->mFullbright == fullbright &&
|
||||
draw_vec[idx]->mBump == bump &&
|
||||
(!mat || (draw_vec[idx]->mShiny == shiny)) && // need to break batches when a material is shared, but legacy settings are different
|
||||
draw_vec[idx]->mTextureMatrix == tex_mat &&
|
||||
draw_vec[idx]->mModelMatrix == model_mat &&
|
||||
draw_vec[idx]->mShaderMask == shader_mask &&
|
||||
draw_vec[idx]->mAvatar == facep->mAvatar &&
|
||||
draw_vec[idx]->getSkinHash() == facep->getSkinHash())
|
||||
info->mMaterialID == mat_id &&
|
||||
info->mFullbright == fullbright &&
|
||||
info->mBump == bump &&
|
||||
(!mat || (info->mShiny == shiny)) && // need to break batches when a material is shared, but legacy settings are different
|
||||
info->mTextureMatrix == tex_mat &&
|
||||
info->mModelMatrix == model_mat &&
|
||||
info->mShaderMask == shader_mask &&
|
||||
info->mAvatar == facep->mAvatar &&
|
||||
info->getSkinHash() == facep->getSkinHash())
|
||||
{
|
||||
draw_vec[idx]->mCount += facep->getIndicesCount();
|
||||
draw_vec[idx]->mEnd += facep->getGeomCount();
|
||||
info->mCount += facep->getIndicesCount();
|
||||
info->mEnd += facep->getGeomCount();
|
||||
|
||||
if (index < FACE_DO_NOT_BATCH_TEXTURES && index >= draw_vec[idx]->mTextureList.size())
|
||||
if (index < FACE_DO_NOT_BATCH_TEXTURES && index >= info->mTextureList.size())
|
||||
{
|
||||
draw_vec[idx]->mTextureList.resize(index+1);
|
||||
draw_vec[idx]->mTextureList[index] = tex;
|
||||
info->mTextureList.resize(index+1);
|
||||
info->mTextureList[index] = tex;
|
||||
}
|
||||
draw_vec[idx]->validate();
|
||||
info->validate();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -5342,6 +5344,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
U32 count = facep->getIndicesCount();
|
||||
LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex,
|
||||
facep->getVertexBuffer(), fullbright, bump);
|
||||
|
||||
info = draw_info;
|
||||
|
||||
draw_vec.push_back(draw_info);
|
||||
draw_info->mTextureMatrix = tex_mat;
|
||||
draw_info->mModelMatrix = model_mat;
|
||||
|
|
@ -5417,6 +5422,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
}
|
||||
draw_info->validate();
|
||||
}
|
||||
|
||||
llassert(type != LLPipeline::RENDER_TYPE_PASS_GLTF_PBR || info->mGLTFMaterial != nullptr);
|
||||
llassert(type != LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_RIGGED || info->mGLTFMaterial != nullptr);
|
||||
llassert(type != LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_ALPHA_MASK || info->mGLTFMaterial != nullptr);
|
||||
llassert(type != LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_ALPHA_MASK_RIGGED || info->mGLTFMaterial != nullptr);
|
||||
|
||||
llassert(type != LLRenderPass::PASS_NORMSPEC || info->mNormalMap.notNull());
|
||||
}
|
||||
|
||||
void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group)
|
||||
|
|
@ -5790,7 +5802,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
}
|
||||
facep->setPoolType(type);
|
||||
|
||||
if (vobj->isHUDAttachment())
|
||||
if (vobj->isHUDAttachment() && !is_pbr)
|
||||
{
|
||||
facep->setState(LLFace::FULLBRIGHT);
|
||||
}
|
||||
|
|
@ -6487,17 +6499,17 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
fullbright = TRUE;
|
||||
}
|
||||
|
||||
if (hud_group)
|
||||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
LLGLTFMaterial* gltf_mat = te->getGLTFRenderMaterial();
|
||||
|
||||
if (hud_group && gltf_mat == nullptr)
|
||||
{ //all hud attachments are fullbright
|
||||
fullbright = TRUE;
|
||||
}
|
||||
|
||||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
|
||||
tex = facep->getTexture();
|
||||
|
||||
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;
|
||||
|
||||
LLGLTFMaterial* gltf_mat = te->getGLTFRenderMaterial();
|
||||
|
||||
LLMaterial* mat = nullptr;
|
||||
bool can_be_shiny = false;
|
||||
|
|
@ -6523,7 +6535,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
|
||||
is_alpha = (is_alpha || transparent) ? TRUE : FALSE;
|
||||
|
||||
if ((gltf_mat || mat) && LLPipeline::sRenderDeferred && !hud_group)
|
||||
if (gltf_mat || (mat && !hud_group))
|
||||
{
|
||||
bool material_pass = false;
|
||||
|
||||
|
|
@ -6692,7 +6704,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY);
|
||||
registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);
|
||||
}
|
||||
else if (LLPipeline::sRenderDeferred && !hud_group)
|
||||
else if (!hud_group)
|
||||
{ //deferred rendering
|
||||
if (te->getFullbright())
|
||||
{ //register in post deferred fullbright shiny pass
|
||||
|
|
@ -6737,7 +6749,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
{
|
||||
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
|
||||
}
|
||||
if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && use_legacy_bump)
|
||||
if (!hud_group && LLPipeline::sRenderBump && use_legacy_bump)
|
||||
{ //if this is the deferred render and a bump map is present, register in post deferred bump
|
||||
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
|
||||
}
|
||||
|
|
@ -6773,7 +6785,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
}
|
||||
|
||||
//not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010
|
||||
if (!is_alpha && (hud_group || !LLPipeline::sRenderDeferred))
|
||||
if (!is_alpha && hud_group)
|
||||
{
|
||||
llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);
|
||||
facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE);
|
||||
|
|
|
|||
|
|
@ -3934,6 +3934,8 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
|
|||
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
|
||||
LL_PROFILE_GPU_ZONE("renderGeomDeferred");
|
||||
|
||||
llassert(!sRenderingHUDs);
|
||||
|
||||
if (gUseWireframe)
|
||||
{
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
|
|
@ -7998,6 +8000,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
return;
|
||||
}
|
||||
|
||||
llassert(!sRenderingHUDs);
|
||||
|
||||
static LLCachedControl<F32> ambiance_scale(gSavedSettings, "RenderReflectionProbeAmbianceScale", 8.f);
|
||||
|
||||
F32 light_scale = 1.f;
|
||||
|
|
|
|||
Loading…
Reference in New Issue