#677 WIP -- add mirror clipping to more shaders
parent
a4225663ac
commit
b2462355a3
|
|
@ -183,7 +183,13 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
|||
// Attach Fragment Shader Features Next
|
||||
///////////////////////////////////////
|
||||
|
||||
// NOTE order of shader object attaching is VERY IMPORTANT!!!
|
||||
// NOTE order of shader object attaching is VERY IMPORTANT!!!
|
||||
|
||||
if (!shader->attachFragmentObject("deferred/globalF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (features->hasSrgb || features->hasAtmospherics || features->calculatesAtmospherics || features->isDeferred)
|
||||
{
|
||||
if (!shader->attachFragmentObject("environment/srgbF.glsl"))
|
||||
|
|
|
|||
|
|
@ -37,11 +37,15 @@ in vec3 vary_mat2;
|
|||
|
||||
in vec4 vertex_color;
|
||||
in vec2 vary_texcoord0;
|
||||
in vec3 vary_position;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
void main()
|
||||
{
|
||||
mirrorClip(vary_position);
|
||||
|
||||
vec4 col = texture(diffuseMap, vary_texcoord0.xy);
|
||||
|
||||
if(col.a < minimum_alpha)
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat3 normal_matrix;
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
|
@ -38,11 +39,11 @@ out vec3 vary_mat1;
|
|||
out vec3 vary_mat2;
|
||||
out vec4 vertex_color;
|
||||
out vec2 vary_texcoord0;
|
||||
out vec3 vary_position;
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
mat4 getObjectSkinnedTransform();
|
||||
uniform mat4 projection_matrix;
|
||||
uniform mat4 modelview_matrix;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
|
|
@ -52,11 +53,13 @@ void main()
|
|||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
|
||||
vary_position = pos;
|
||||
gl_Position = projection_matrix*vec4(pos, 1.0);
|
||||
|
||||
vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
|
||||
vec3 t = normalize((mat * vec4(tangent.xyz+position.xyz, 1.0)).xyz-pos.xyz);
|
||||
#else
|
||||
vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz;
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
vec3 n = normalize(normal_matrix * normal);
|
||||
vec3 t = normalize(normal_matrix * tangent.xyz);
|
||||
|
|
|
|||
|
|
@ -32,11 +32,14 @@ uniform sampler2D diffuseMap;
|
|||
in vec3 vary_normal;
|
||||
in vec4 vertex_color;
|
||||
in vec2 vary_texcoord0;
|
||||
in vec3 vary_position;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
void main()
|
||||
{
|
||||
mirrorClip(vary_position);
|
||||
vec3 col = vertex_color.rgb * texture(diffuseMap, vary_texcoord0.xy).rgb;
|
||||
frag_data[0] = vec4(col, 0.0);
|
||||
frag_data[1] = vertex_color.aaaa; // spec
|
||||
|
|
|
|||
|
|
@ -30,12 +30,15 @@ out vec4 frag_data[4];
|
|||
in vec3 vary_normal;
|
||||
in vec4 vertex_color;
|
||||
in vec2 vary_texcoord0;
|
||||
in vec3 vary_position;
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
vec2 encode_normal(vec3 n);
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
|
||||
void main()
|
||||
{
|
||||
mirrorClip(vary_position);
|
||||
vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb;
|
||||
|
||||
vec3 spec;
|
||||
|
|
|
|||
|
|
@ -36,13 +36,16 @@ out vec3 vary_normal;
|
|||
|
||||
out vec4 vertex_color;
|
||||
out vec2 vary_texcoord0;
|
||||
out vec3 vary_position;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
uniform mat4 modelview_matrix;
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
mat4 getObjectSkinnedTransform();
|
||||
uniform mat4 projection_matrix;
|
||||
uniform mat4 modelview_matrix;
|
||||
|
||||
#endif
|
||||
|
||||
void main()
|
||||
|
|
@ -51,9 +54,11 @@ void main()
|
|||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec4 pos = mat * vec4(position.xyz, 1.0);
|
||||
vary_position = pos.xyz;
|
||||
gl_Position = projection_matrix * pos;
|
||||
vary_normal = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz);
|
||||
#else
|
||||
vary_position = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
vary_normal = normalize(normal_matrix * normal);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -50,9 +50,11 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
|
|||
vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color);
|
||||
#endif
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
mirrorClip(vary_position);
|
||||
#ifdef IS_ALPHA
|
||||
waterClip(vary_position.xyz);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* @file class1/deferred/globalF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2024&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2024, 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$
|
||||
*/
|
||||
|
||||
|
||||
// Global helper functions included in every fragment shader
|
||||
// DO NOT declare sampler uniforms here as OS X doesn't compile
|
||||
// them out
|
||||
|
||||
uniform float mirror_flag;
|
||||
uniform vec4 clipPlane;
|
||||
uniform float clipSign;
|
||||
|
||||
void mirrorClip(vec3 pos)
|
||||
{
|
||||
if (mirror_flag > 0)
|
||||
{
|
||||
if ((dot(pos.xyz, clipPlane.xyz) + clipPlane.w) < 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -60,34 +60,14 @@ vec3 srgb_to_linear(vec3 c);
|
|||
|
||||
uniform vec4 clipPlane;
|
||||
uniform float clipSign;
|
||||
uniform float mirror_flag;
|
||||
void applyClip(vec3 pos)
|
||||
{
|
||||
if (mirror_flag > 0)
|
||||
{
|
||||
// TODO: make this less branchy
|
||||
if (clipSign > 0)
|
||||
{
|
||||
if ((dot(pos.xyz, clipPlane.xyz) + clipPlane.w) < 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((dot(pos.xyz, clipPlane.xyz) + clipPlane.w) > 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
uniform mat3 normal_matrix;
|
||||
|
||||
void main()
|
||||
{
|
||||
applyClip(vary_position);
|
||||
mirrorClip(vary_position);
|
||||
|
||||
vec4 basecolor = texture(diffuseMap, base_color_texcoord.xy).rgba;
|
||||
if (basecolor.a < minimum_alpha)
|
||||
|
|
|
|||
|
|
@ -30,9 +30,13 @@ uniform sampler2D texture1;
|
|||
|
||||
in vec2 vary_texcoord0;
|
||||
in vec2 vary_texcoord1;
|
||||
in vec3 vary_position;
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
void main()
|
||||
{
|
||||
mirrorClip(vary_position);
|
||||
float tex0 = texture(texture0, vary_texcoord0.xy).a;
|
||||
float tex1 = texture(texture1, vary_texcoord1.xy).a;
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
|
|
@ -32,11 +33,11 @@ in vec2 texcoord1;
|
|||
|
||||
out vec2 vary_texcoord0;
|
||||
out vec2 vary_texcoord1;
|
||||
out vec3 vary_position;
|
||||
|
||||
#ifdef HAS_SKIN
|
||||
mat4 getObjectSkinnedTransform();
|
||||
uniform mat4 projection_matrix;
|
||||
uniform mat4 modelview_matrix;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
|
|
@ -46,8 +47,10 @@ void main()
|
|||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec4 pos = mat * vec4(position.xyz, 1.0);
|
||||
vary_position = pos.xyz;
|
||||
gl_Position = projection_matrix * pos;
|
||||
#else
|
||||
vary_position = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
|
||||
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
#endif
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
|
|
|||
|
|
@ -53,8 +53,11 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout
|
|||
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
void main()
|
||||
{
|
||||
mirrorClip(vary_position);
|
||||
#ifdef HAS_DIFFUSE_LOOKUP
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -45,26 +45,13 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
|
|||
vec3 srgb_to_linear(vec3 cs);
|
||||
vec3 linear_to_srgb(vec3 cs);
|
||||
|
||||
uniform vec4 clipPlane;
|
||||
uniform float clipSign;
|
||||
uniform float mirror_flag;
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat3 normal_matrix;
|
||||
void applyClip(vec3 pos)
|
||||
{
|
||||
|
||||
if (mirror_flag > 0)
|
||||
{
|
||||
if ((dot(pos.xyz, clipPlane.xyz) + clipPlane.w) < 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
in vec3 vary_position;
|
||||
|
||||
void mirrorClip(vec3 pos);
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
out vec4 frag_color;
|
||||
|
|
@ -305,7 +292,7 @@ float getShadow(vec3 pos, vec3 norm)
|
|||
|
||||
void main()
|
||||
{
|
||||
applyClip(vary_position);
|
||||
mirrorClip(vary_position);
|
||||
waterClip();
|
||||
|
||||
// diffcol == diffuse map combined with vertex color
|
||||
|
|
@ -430,9 +417,6 @@ void main()
|
|||
|
||||
float flag = GBUFFER_FLAG_HAS_ATMOS;
|
||||
|
||||
if (mirror_flag > 0)
|
||||
flag = 1;
|
||||
|
||||
frag_data[0] = vec4(diffcol.rgb, emissive); // gbuffer is sRGB for legacy materials
|
||||
frag_data[1] = vec4(spec.rgb, glossiness); // XYZ = Specular color. W = Specular exponent.
|
||||
frag_data[2] = vec4(encode_normal(norm), env, flag);; // XY = Normal. Z = Env. intensity. W = 1 skip atmos (mask off fog)
|
||||
|
|
|
|||
|
|
@ -291,6 +291,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
|
|||
mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma
|
||||
mShaderList.push_back(&gNoPostGammaCorrectProgram);
|
||||
mShaderList.push_back(&gLegacyPostGammaCorrectProgram);
|
||||
mShaderList.push_back(&gDeferredDiffuseProgram);
|
||||
mShaderList.push_back(&gObjectBumpProgram);
|
||||
mShaderList.push_back(&gDeferredBumpProgram);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -676,6 +679,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
|
|||
index_channels.push_back(-1); shaders.push_back( make_pair( "environment/encodeNormF.glsl", mShaderLevel[SHADER_ENVIRONMENT] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "environment/srgbF.glsl", mShaderLevel[SHADER_ENVIRONMENT] ) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/deferredUtil.glsl", 1) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/globalF.glsl", 1));
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/shadowUtil.glsl", 1) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/aoUtil.glsl", 1) );
|
||||
index_channels.push_back(-1); shaders.push_back( make_pair( "deferred/pbrterrainUtilF.glsl", 1) );
|
||||
|
|
|
|||
Loading…
Reference in New Issue