Merge branch 'DRTVWR-559' of https://github.com/secondlife/viewer
# Conflicts: # autobuild.xml # indra/newview/app_settings/settings.xml # indra/newview/llviewercontrol.cpp # indra/newview/pipeline.cppmaster
commit
45fdf20c3d
|
|
@ -672,9 +672,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>7b4aceaed511d44c4d1354b2162b59c7</string>
|
||||
<string>02b569ac2bd71f201e3dd86ade7b3eeb</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107398/936936/bugsplat-1.0.7.576560-darwin64-576560.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113876/983684/bugsplat-1.0.7.579696-darwin64-579696.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -684,9 +684,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>53918c7c74b943cdc0bb90caf9657a84</string>
|
||||
<string>5b32c47ae8e8cf0d4106f08e8db18044</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107400/936949/bugsplat-4.0.3.0.576560-windows-576560.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113878/983697/bugsplat-4.0.3.0.579696-windows-579696.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -696,16 +696,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>19d6a55db101f02e7eb531daf3e8cfd1</string>
|
||||
<string>79c005fd8a660f8551b3c9ede64fa4ef</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107401/936948/bugsplat-.576560-windows64-576560.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113879/983696/bugsplat-4.0.3.0.579696-windows64-579696.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>4.0.3.0.576560</string>
|
||||
<string>4.0.3.0.579696</string>
|
||||
</map>
|
||||
<key>colladadom</key>
|
||||
<map>
|
||||
|
|
@ -3045,16 +3045,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
<key>linux64</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>46edf0f55417f8ef0d33a5c007bc3644</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/89310/815451/threejs-0.132.2-windows64-564843.tar.bz2</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>0.132.2</string>
|
||||
|
|
|
|||
|
|
@ -1085,7 +1085,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextu
|
|||
return uniform;
|
||||
}
|
||||
|
||||
S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode)
|
||||
S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth, LLTexUnit::eTextureFilterOptions mode, U32 index)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
|
||||
|
||||
|
|
@ -1103,7 +1103,7 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,
|
|||
}
|
||||
else {
|
||||
bool has_mips = mode == LLTexUnit::TFO_TRILINEAR || mode == LLTexUnit::TFO_ANISOTROPIC;
|
||||
gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(0), has_mips);
|
||||
gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(index), has_mips);
|
||||
}
|
||||
|
||||
gGL.getTexUnit(uniform)->setTextureFilteringOption(mode);
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ public:
|
|||
S32 bindTexture(const std::string& uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);
|
||||
S32 bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureColorSpace space = LLTexUnit::TCS_LINEAR);
|
||||
S32 bindTexture(const std::string& uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR);
|
||||
S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR);
|
||||
S32 bindTexture(S32 uniform, LLRenderTarget* texture, bool depth = false, LLTexUnit::eTextureFilterOptions mode = LLTexUnit::TFO_BILINEAR, U32 index = 0);
|
||||
S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
|
||||
|
||||
|
|
|
|||
|
|
@ -97,6 +97,13 @@ public:
|
|||
TFO_ANISOTROPIC // Equal to: min=anisotropic, max=anisotropic, mip=linear.
|
||||
} eTextureFilterOptions;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TMG_NONE = 0, // Mipmaps are not automatically generated for this texture.
|
||||
TMG_AUTO, // Mipmaps are automatically generated for this texture.
|
||||
TMG_MANUAL // Mipmaps are manually generated for this texture.
|
||||
} eTextureMipGeneration;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TB_REPLACE = 0,
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ void LLRenderTarget::resize(U32 resx, U32 resy)
|
|||
}
|
||||
|
||||
|
||||
bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage)
|
||||
bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLTexUnit::eTextureType usage, LLTexUnit::eTextureMipGeneration generateMipMaps)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
|
||||
llassert(usage == LLTexUnit::TT_TEXTURE);
|
||||
|
|
@ -118,6 +118,13 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, LLT
|
|||
|
||||
mUsage = usage;
|
||||
mUseDepth = depth;
|
||||
|
||||
mGenerateMipMaps = generateMipMaps;
|
||||
|
||||
if (mGenerateMipMaps != LLTexUnit::TMG_NONE) {
|
||||
// Calculate the number of mip levels based upon resolution that we should have.
|
||||
mMipLevels = 1 + floor(log10((float)llmax(mResX, mResY))/log10(2.0));
|
||||
}
|
||||
|
||||
if (depth)
|
||||
{
|
||||
|
|
@ -512,6 +519,12 @@ void LLRenderTarget::flush()
|
|||
llassert(sCurFBO == mFBO);
|
||||
llassert(sBoundTarget == this);
|
||||
|
||||
if (mGenerateMipMaps == LLTexUnit::TMG_AUTO) {
|
||||
LL_PROFILE_GPU_ZONE("rt generate mipmaps");
|
||||
bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
if (mPreviousRT)
|
||||
{
|
||||
// a bit hacky -- pop the RT stack back two frames and push
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ public:
|
|||
// color_fmt - GL color format (e.g. GL_RGB)
|
||||
// depth - if true, allocate a depth buffer
|
||||
// usage - deprecated, should always be TT_TEXTURE
|
||||
bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE);
|
||||
bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth = false, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, LLTexUnit::eTextureMipGeneration generateMipMaps = LLTexUnit::TMG_NONE);
|
||||
|
||||
//resize existing attachments to use new resolution and color format
|
||||
// CAUTION: if the GL runs out of memory attempting to resize, this render target will be undefined
|
||||
|
|
@ -179,6 +179,8 @@ protected:
|
|||
|
||||
U32 mDepth;
|
||||
bool mUseDepth;
|
||||
LLTexUnit::eTextureMipGeneration mGenerateMipMaps;
|
||||
U32 mMipLevels;
|
||||
|
||||
LLTexUnit::eTextureType mUsage;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
<string>RenderQualityPerformance</string>
|
||||
<string>RenderReflectionsEnabled</string>
|
||||
<string>RenderReflectionProbeDetail</string>
|
||||
<string>RenderReflectionProbeLevel</string>
|
||||
<string>RenderScreenSpaceReflections</string>
|
||||
<string>RenderShaderLightingMaxLevel</string>
|
||||
<string>RenderShadowDetail</string>
|
||||
|
|
|
|||
|
|
@ -11846,6 +11846,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderBufferVisualization</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Outputs a selected buffer to the screen. -1 = final render buffer. 0 = Albedo, 1 = Specular/ORM, 2 = Normal, 3 = Emissive, 4 = Eye luminance</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>-1</integer>
|
||||
</map>
|
||||
<key>RenderCompressTextures</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -12896,7 +12907,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RenderFlexTimeFactor</key>
|
||||
<map>
|
||||
|
|
@ -13258,7 +13269,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Comment</key>
|
||||
<string>Render influence volumes of Reflection Probes</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
|
|
@ -13457,16 +13468,27 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<real>0</real>
|
||||
</map>
|
||||
<key>RenderAutomaticReflectionProbes</key>
|
||||
<key>RenderDefaultProbeUpdatePeriod</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Automatic reflection probes control. 0 - disable, 1 - Terrain/water only, 2- Terrain/water + objects. Requires restart.</string>
|
||||
<string>When RenderReflectionProbeLevel is 0, amount of time in seconds to wait between updates to reflection map.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>20.0</real>
|
||||
</map>
|
||||
<key>RenderReflectionProbeLevel</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Reflection probes control. 0 - disable (one probe to rule them all), 1 - manual probes only, 2 - manual + terrain/water, 3 - Manual + Terrain/water + objects.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
<key>RenderReflectionRes</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
out vec4 frag_data[4];
|
||||
|
||||
uniform vec4 color;
|
||||
uniform vec3 moonlight_color;
|
||||
uniform vec3 moon_dir;
|
||||
uniform float moon_brightness;
|
||||
uniform sampler2D diffuseMap;
|
||||
|
|
@ -53,11 +52,7 @@ void main()
|
|||
discard;
|
||||
}
|
||||
|
||||
|
||||
c.rgb *= moonlight_color.rgb;
|
||||
c.rgb *= moon_brightness;
|
||||
|
||||
c.rgb *= fade;
|
||||
c.a *= fade;
|
||||
|
||||
frag_data[0] = vec4(0);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
/**
|
||||
* @file postDeferredNoDoFF.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$
|
||||
*/
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform float mipLevel;
|
||||
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 diff = textureLod(diffuseRect, vary_fragcoord.xy, mipLevel);
|
||||
|
||||
frag_color = diff;
|
||||
}
|
||||
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/**
|
||||
* @file shadowAlphaMaskSkinnedV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2021&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$
|
||||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 projection_matrix;
|
||||
uniform float shadow_target_width;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec4 diffuse_color;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
VARYING vec4 post_pos;
|
||||
VARYING float target_pos_x;
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void passTextureIndex();
|
||||
|
||||
mat4 getObjectSkinnedTransform();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
|
||||
mat = modelview_matrix * mat;
|
||||
|
||||
vec4 pos = mat * pre_pos;
|
||||
pos = projection_matrix * pos;
|
||||
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
post_pos = pos;
|
||||
|
||||
gl_Position = pos;
|
||||
|
||||
passTextureIndex();
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
|
|
@ -24,7 +24,12 @@
|
|||
*/
|
||||
|
||||
uniform mat4 texture_matrix0;
|
||||
#if defined(HAS_SKIN)
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 projection_matrix;
|
||||
#else
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
#endif
|
||||
uniform float shadow_target_width;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
|
@ -38,11 +43,24 @@ VARYING vec2 vary_texcoord0;
|
|||
|
||||
void passTextureIndex();
|
||||
|
||||
#if defined(HAS_SKIN)
|
||||
mat4 getObjectSkinnedTransform();
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
#if defined(HAS_SKIN)
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
mat = modelview_matrix * mat;
|
||||
vec4 pos = mat * pre_pos;
|
||||
pos = projection_matrix * pos;
|
||||
#else
|
||||
vec4 pre_pos = vec4(position.xyz, 1.0);
|
||||
vec4 pos = modelview_projection_matrix * pre_pos;
|
||||
#endif
|
||||
|
||||
target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x;
|
||||
|
||||
post_pos = pos;
|
||||
|
|
|
|||
|
|
@ -53,8 +53,11 @@ void main()
|
|||
vec4 pos = getPosition(pos_screen);
|
||||
vec3 norm = getNorm(pos_screen);
|
||||
|
||||
frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
frag_color.g = 1.0f;
|
||||
frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
vec4 col;
|
||||
col.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
col.g = 1.0f;
|
||||
col.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
col.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
|
||||
frag_color = clamp(col, vec4(0), vec4(1));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,8 +50,11 @@ void main()
|
|||
vec4 pos = getPosition(pos_screen);
|
||||
vec3 norm = getNorm(pos_screen);
|
||||
|
||||
frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
frag_color.g = calcAmbientOcclusion(pos, norm, pos_screen);
|
||||
frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
vec4 col;
|
||||
col.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen);
|
||||
col.g = calcAmbientOcclusion(pos, norm, pos_screen);
|
||||
col.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);
|
||||
col.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);
|
||||
|
||||
frag_color = clamp(col, vec4(0), vec4(1));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ bool shouldSampleProbe(int i, vec3 pos)
|
|||
// populate "probeIndex" with N probe indices that influence pos where N is REF_SAMPLE_COUNT
|
||||
void preProbeSample(vec3 pos)
|
||||
{
|
||||
#if REFMAP_LEVEL > 0
|
||||
// TODO: make some sort of structure that reduces the number of distance checks
|
||||
for (int i = 1; i < refmapCount; ++i)
|
||||
{
|
||||
|
|
@ -213,6 +214,9 @@ void preProbeSample(vec3 pos)
|
|||
{ // probe at index 0 is a special probe for smoothing out automatic probes
|
||||
probeIndex[probeInfluences++] = 0;
|
||||
}
|
||||
#else
|
||||
probeIndex[probeInfluences++] = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
// from https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection
|
||||
|
|
|
|||
|
|
@ -246,20 +246,6 @@ void main()
|
|||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
|
||||
#if 0 // wrong implementation
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
float sa = dot(normalize(refnormpersp), light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
color.rgb += spec_contrib;
|
||||
|
||||
// add radiance map
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
}
|
||||
#else //right implementation (ported from pointLightF.glsl)
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
vec3 lv = light_dir.xyz;
|
||||
|
|
@ -284,7 +270,6 @@ void main()
|
|||
// add radiance map
|
||||
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
|
||||
}
|
||||
#endif
|
||||
|
||||
color.rgb = mix(color.rgb, baseColor.rgb, baseColor.a);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 54
|
||||
version 55
|
||||
// The version number above should be incremented IF AND ONLY IF some
|
||||
// change has been made that is sufficiently important to justify
|
||||
// resetting the graphics preferences of all users to the recommended
|
||||
|
|
@ -62,6 +62,7 @@ Disregard96DefaultDrawDistance 1 1
|
|||
RenderCompressTextures 1 1
|
||||
RenderShaderLightingMaxLevel 1 3
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
RenderDeferred 1 1
|
||||
RenderDeferredSSAO 1 1
|
||||
RenderUseAdvancedAtmospherics 1 0
|
||||
|
|
@ -104,6 +105,7 @@ WLSkyDetail 1 96
|
|||
RenderFSAASamples 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 8
|
||||
RenderReflectionProbeLevel 1 0
|
||||
|
||||
//
|
||||
// Medium Low Graphics Settings
|
||||
|
|
@ -133,6 +135,7 @@ WLSkyDetail 1 96
|
|||
RenderFSAASamples 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 16
|
||||
RenderReflectionProbeLevel 1 1
|
||||
|
||||
//
|
||||
// Medium Graphics Settings (standard)
|
||||
|
|
@ -162,6 +165,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 32
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// Medium High Graphics Settings (deferred enabled)
|
||||
|
|
@ -191,6 +195,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 64
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// High Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -220,6 +225,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 128
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// High Ultra Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -249,6 +255,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -278,6 +285,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 1
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 40
|
||||
version 41
|
||||
// The version number above should be incremented IF AND ONLY IF some
|
||||
// change has been made that is sufficiently important to justify
|
||||
// resetting the graphics preferences of all users to the recommended
|
||||
|
|
@ -62,6 +62,7 @@ Disregard96DefaultDrawDistance 1 1
|
|||
RenderCompressTextures 1 1
|
||||
RenderShaderLightingMaxLevel 1 3
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
RenderDeferred 1 1
|
||||
RenderDeferredSSAO 1 1
|
||||
RenderUseAdvancedAtmospherics 1 0
|
||||
|
|
@ -104,6 +105,7 @@ WLSkyDetail 1 96
|
|||
RenderFSAASamples 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 8
|
||||
RenderReflectionProbeLevel 1 0
|
||||
|
||||
//
|
||||
// Medium Low Graphics Settings
|
||||
|
|
@ -133,6 +135,7 @@ WLSkyDetail 1 96
|
|||
RenderFSAASamples 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 16
|
||||
RenderReflectionProbeLevel 1 1
|
||||
|
||||
//
|
||||
// Medium Graphics Settings (standard)
|
||||
|
|
@ -162,6 +165,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 32
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// Medium High Graphics Settings (deferred enabled)
|
||||
|
|
@ -191,6 +195,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 64
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// High Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -220,6 +225,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 128
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// High Ultra Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -249,6 +255,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -278,6 +285,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 1
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 49
|
||||
version 50
|
||||
// The version number above should be incremented IF AND ONLY IF some
|
||||
// change has been made that is sufficiently important to justify
|
||||
// resetting the graphics preferences of all users to the recommended
|
||||
|
|
@ -73,6 +73,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 2
|
||||
RenderScreenSpaceReflections 1 1
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Low Graphics Settings
|
||||
|
|
@ -102,6 +103,7 @@ RenderReflectionsEnabled 1 0
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 8
|
||||
RenderReflectionProbeLevel 1 0
|
||||
|
||||
//
|
||||
// Medium Low Graphics Settings
|
||||
|
|
@ -131,6 +133,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 16
|
||||
RenderReflectionProbeLevel 1 1
|
||||
|
||||
//
|
||||
// Medium Graphics Settings (standard)
|
||||
|
|
@ -160,6 +163,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 32
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// Medium High Graphics Settings (deferred enabled)
|
||||
|
|
@ -189,6 +193,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 0
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 64
|
||||
RenderReflectionProbeLevel 1 2
|
||||
|
||||
//
|
||||
// High Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -218,6 +223,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 128
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// High Ultra Graphics Settings (deferred + SSAO)
|
||||
|
|
@ -247,6 +253,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 0
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -276,6 +283,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 1
|
||||
RenderScreenSpaceReflections 1 1
|
||||
RenderReflectionProbeCount 1 256
|
||||
RenderReflectionProbeLevel 1 3
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -475,23 +475,28 @@ void LLRenderPass::pushGLTFBatches(U32 type)
|
|||
LLDrawInfo& params = **i;
|
||||
LLCullResult::increment_iterator(i, end);
|
||||
|
||||
auto& mat = params.mGLTFMaterial;
|
||||
|
||||
mat->bind(params.mTexture);
|
||||
|
||||
LLGLDisable cull_face(mat->mDoubleSided ? GL_CULL_FACE : 0);
|
||||
|
||||
setup_texture_matrix(params);
|
||||
|
||||
applyModelMatrix(params);
|
||||
|
||||
params.mVertexBuffer->setBuffer();
|
||||
params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
|
||||
|
||||
teardown_texture_matrix(params);
|
||||
pushGLTFBatch(params);
|
||||
}
|
||||
}
|
||||
|
||||
void LLRenderPass::pushGLTFBatch(LLDrawInfo& params)
|
||||
{
|
||||
auto& mat = params.mGLTFMaterial;
|
||||
|
||||
mat->bind(params.mTexture);
|
||||
|
||||
LLGLDisable cull_face(mat->mDoubleSided ? GL_CULL_FACE : 0);
|
||||
|
||||
setup_texture_matrix(params);
|
||||
|
||||
applyModelMatrix(params);
|
||||
|
||||
params.mVertexBuffer->setBuffer();
|
||||
params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
|
||||
|
||||
teardown_texture_matrix(params);
|
||||
}
|
||||
|
||||
void LLRenderPass::pushRiggedGLTFBatches(U32 type)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
|
||||
|
|
@ -506,30 +511,22 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type)
|
|||
LLDrawInfo& params = **i;
|
||||
LLCullResult::increment_iterator(i, end);
|
||||
|
||||
auto& mat = params.mGLTFMaterial;
|
||||
|
||||
mat->bind(params.mTexture);
|
||||
|
||||
LLGLDisable cull_face(mat->mDoubleSided ? GL_CULL_FACE : 0);
|
||||
|
||||
setup_texture_matrix(params);
|
||||
|
||||
applyModelMatrix(params);
|
||||
|
||||
if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
|
||||
{
|
||||
uploadMatrixPalette(params);
|
||||
lastAvatar = params.mAvatar;
|
||||
lastMeshId = params.mSkinInfo->mHash;
|
||||
}
|
||||
|
||||
params.mVertexBuffer->setBuffer();
|
||||
params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
|
||||
|
||||
teardown_texture_matrix(params);
|
||||
pushRiggedGLTFBatch(params, lastAvatar, lastMeshId);
|
||||
}
|
||||
}
|
||||
|
||||
void LLRenderPass::pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
|
||||
{
|
||||
if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
|
||||
{
|
||||
uploadMatrixPalette(params);
|
||||
lastAvatar = params.mAvatar;
|
||||
lastMeshId = params.mSkinInfo->mHash;
|
||||
}
|
||||
|
||||
pushGLTFBatch(params);
|
||||
}
|
||||
|
||||
void LLRenderPass::pushBatches(U32 type, bool texture, bool batch_textures)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
|
||||
|
|
|
|||
|
|
@ -329,6 +329,10 @@ public:
|
|||
return "PASS_GLTF_PBR";
|
||||
case PASS_GLTF_PBR_RIGGED:
|
||||
return "PASS_GLTF_PBR_RIGGED";
|
||||
case PASS_GLTF_PBR_ALPHA_MASK:
|
||||
return "PASS_GLTF_PBR_ALPHA_MASK";
|
||||
case PASS_GLTF_PBR_ALPHA_MASK_RIGGED:
|
||||
return "PASS_GLTF_PBR_ALPHA_MASK_RIGGED";
|
||||
default:
|
||||
return "Unknown pass";
|
||||
}
|
||||
|
|
@ -348,7 +352,9 @@ public:
|
|||
virtual void pushBatches(U32 type, bool texture = true, bool batch_textures = false);
|
||||
virtual void pushRiggedBatches(U32 type, bool texture = true, bool batch_textures = false);
|
||||
void pushGLTFBatches(U32 type);
|
||||
void pushGLTFBatch(LLDrawInfo& params);
|
||||
void pushRiggedGLTFBatches(U32 type);
|
||||
void pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId);
|
||||
virtual void pushMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
|
||||
virtual void pushRiggedMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
|
||||
virtual void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false);
|
||||
|
|
|
|||
|
|
@ -1134,21 +1134,27 @@ void LLFace::updateRebuildFlags()
|
|||
|
||||
bool LLFace::canRenderAsMask()
|
||||
{
|
||||
if (LLPipeline::sNoAlpha)
|
||||
const LLTextureEntry* te = getTextureEntry();
|
||||
if( !te || !getViewerObject() || !getTexture() )
|
||||
{
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (te->getGLTFRenderMaterial())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (LLPipeline::sNoAlpha)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isState(LLFace::RIGGED))
|
||||
{ // never auto alpha-mask rigged faces
|
||||
return false;
|
||||
}
|
||||
|
||||
const LLTextureEntry* te = getTextureEntry();
|
||||
if( !te || !getViewerObject() || !getTexture() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
LLMaterial* mat = te->getMaterialParams();
|
||||
if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
|
|
|||
|
|
@ -70,13 +70,16 @@ void LLFetchedGLTFMaterial::bind(LLViewerTexture* media_tex)
|
|||
LLViewerTexture* baseColorTex = media_tex ? media_tex : mBaseColorTexture;
|
||||
LLViewerTexture* emissiveTex = media_tex ? media_tex : mEmissiveTexture;
|
||||
|
||||
if (mAlphaMode == LLGLTFMaterial::ALPHA_MODE_MASK)
|
||||
if (!LLPipeline::sShadowRender || (mAlphaMode == LLGLTFMaterial::ALPHA_MODE_MASK))
|
||||
{
|
||||
// dividing the alpha cutoff by transparency here allows the shader to compare against
|
||||
// the alpha value of the texture without needing the transparency value
|
||||
min_alpha = mAlphaCutoff/mBaseColor.mV[3];
|
||||
if (mAlphaMode == LLGLTFMaterial::ALPHA_MODE_MASK)
|
||||
{
|
||||
// dividing the alpha cutoff by transparency here allows the shader to compare against
|
||||
// the alpha value of the texture without needing the transparency value
|
||||
min_alpha = mAlphaCutoff/mBaseColor.mV[3];
|
||||
}
|
||||
shader->uniform1f(LLShaderMgr::MINIMUM_ALPHA, min_alpha);
|
||||
}
|
||||
shader->uniform1f(LLShaderMgr::MINIMUM_ALPHA, min_alpha);
|
||||
|
||||
if (baseColorTex != nullptr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -162,49 +162,43 @@ public:
|
|||
|
||||
|
||||
LLSD message;
|
||||
|
||||
sparam_t::const_iterator it = strings.begin();
|
||||
if (it != strings.end())
|
||||
bool success = true;
|
||||
for(const std::string& llsdRaw : strings)
|
||||
{
|
||||
const std::string& llsdRaw = *it++;
|
||||
std::istringstream llsdData(llsdRaw);
|
||||
if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length()))
|
||||
{
|
||||
LL_WARNS() << "LLGLTFMaterialOverrideDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
|
||||
success = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// malformed message, nothing we can do to handle it
|
||||
LL_DEBUGS("GLTF") << "Empty message" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLGLTFOverrideCacheEntry object_override;
|
||||
if (!object_override.fromLLSD(message))
|
||||
{
|
||||
// malformed message, nothing we can do to handle it
|
||||
LL_DEBUGS("GLTF") << "Message without id:" << message << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Cache the data
|
||||
{
|
||||
LL_DEBUGS("GLTF") << "material overrides cache" << LL_ENDL;
|
||||
|
||||
LLViewerRegion * region = LLWorld::instance().getRegionFromHandle(object_override.mRegionHandle);
|
||||
|
||||
if (region)
|
||||
LLGLTFOverrideCacheEntry object_override;
|
||||
if (!object_override.fromLLSD(message))
|
||||
{
|
||||
region->cacheFullUpdateGLTFOverride(object_override);
|
||||
// malformed message, nothing we can do to handle it
|
||||
LL_DEBUGS("GLTF") << "Message without id:" << message << LL_ENDL;
|
||||
success = false;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
|
||||
// Cache the data
|
||||
{
|
||||
LL_WARNS("GLTF") << "could not access region for material overrides message cache, region_handle: " << LL_ENDL;
|
||||
LLViewerRegion * region = LLWorld::instance().getRegionFromHandle(object_override.mRegionHandle);
|
||||
|
||||
if (region)
|
||||
{
|
||||
region->cacheFullUpdateGLTFOverride(object_override);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("GLTF") << "could not access region for material overrides message cache, region_handle: " << LL_ENDL;
|
||||
}
|
||||
}
|
||||
applyData(object_override);
|
||||
}
|
||||
applyData(object_override);
|
||||
return true;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
void doSelectionCallbacks(const LLUUID& object_id, S32 side)
|
||||
|
|
|
|||
|
|
@ -263,6 +263,30 @@ bool LLReflectionMap::isActive()
|
|||
return mCubeIndex != -1;
|
||||
}
|
||||
|
||||
bool LLReflectionMap::isRelevant()
|
||||
{
|
||||
static LLCachedControl<S32> RenderReflectionProbeLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
|
||||
|
||||
if (mViewerObject && RenderReflectionProbeLevel > 0)
|
||||
{ // not an automatic probe
|
||||
return true;
|
||||
}
|
||||
|
||||
if (RenderReflectionProbeLevel == 3)
|
||||
{ // all automatics are relevant
|
||||
return true;
|
||||
}
|
||||
|
||||
if (RenderReflectionProbeLevel == 2)
|
||||
{ // terrain and water only, ignore probes that have a group
|
||||
return !mGroup;
|
||||
}
|
||||
|
||||
// no automatic probes, yes manual probes
|
||||
return mViewerObject != nullptr;
|
||||
}
|
||||
|
||||
|
||||
void LLReflectionMap::doOcclusion(const LLVector4a& eye)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
|
||||
|
|
|
|||
|
|
@ -72,6 +72,9 @@ public:
|
|||
// perform occlusion query/readback
|
||||
void doOcclusion(const LLVector4a& eye);
|
||||
|
||||
// return false if this probe isn't currently relevant (for example, disabled due to graphics preferences)
|
||||
bool isRelevant();
|
||||
|
||||
// point at which environment map was last generated from (in agent space)
|
||||
LLVector4a mOrigin;
|
||||
|
||||
|
|
|
|||
|
|
@ -173,6 +173,8 @@ void LLReflectionMapManager::update()
|
|||
bool did_update = false;
|
||||
|
||||
static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1);
|
||||
static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
|
||||
|
||||
bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
|
||||
|
||||
LLReflectionMap* closestDynamic = nullptr;
|
||||
|
|
@ -198,6 +200,11 @@ void LLReflectionMapManager::update()
|
|||
continue;
|
||||
}
|
||||
|
||||
if (probe != mDefaultProbe && !probe->isRelevant())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
probe->mProbeIndex = i;
|
||||
|
||||
LLVector4a d;
|
||||
|
|
@ -270,6 +277,13 @@ void LLReflectionMapManager::update()
|
|||
mRadiancePass = radiance_pass;
|
||||
}
|
||||
|
||||
static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 20.f);
|
||||
if (sLevel == 0 &&
|
||||
gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime < sUpdatePeriod)
|
||||
{ // when probes are disabled don't update the default probe more often than once every 20 seconds
|
||||
oldestProbe = nullptr;
|
||||
}
|
||||
|
||||
// switch to updating the next oldest probe
|
||||
if (!did_update && oldestProbe != nullptr)
|
||||
{
|
||||
|
|
@ -360,17 +374,13 @@ void LLReflectionMapManager::getReflectionMaps(std::vector<LLReflectionMap*>& ma
|
|||
|
||||
LLReflectionMap* LLReflectionMapManager::registerSpatialGroup(LLSpatialGroup* group)
|
||||
{
|
||||
static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
|
||||
if (automatic_probes > 1)
|
||||
if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
|
||||
{
|
||||
if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
|
||||
OctreeNode* node = group->getOctreeNode();
|
||||
F32 size = node->getSize().getF32ptr()[0];
|
||||
if (size >= 15.f && size <= 17.f)
|
||||
{
|
||||
OctreeNode* node = group->getOctreeNode();
|
||||
F32 size = node->getSize().getF32ptr()[0];
|
||||
if (size >= 15.f && size <= 17.f)
|
||||
{
|
||||
return addProbe(group);
|
||||
}
|
||||
return addProbe(group);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ public:
|
|||
|
||||
// presently hacked into LLViewerObject::setTE
|
||||
// Used by LLViewerObjects that are Reflection Probes
|
||||
// vobj must not be null
|
||||
// Guaranteed to not return null
|
||||
LLReflectionMap* registerViewerObject(LLViewerObject* vobj);
|
||||
|
||||
|
|
|
|||
|
|
@ -512,6 +512,7 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
|
|||
gPipeline.releaseGLBuffers();
|
||||
gPipeline.createGLBuffers();
|
||||
LLViewerShaderMgr::instance()->setShaders();
|
||||
gPipeline.mReflectionMapManager.reset();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1147,6 +1148,7 @@ void settings_setup_listeners()
|
|||
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderResolutionMultiplier", handleRenderResolutionDivisorChanged);
|
||||
// [/SL:KB]
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);
|
||||
|
|
|
|||
|
|
@ -1340,43 +1340,40 @@ U32 LLViewerRegion::getNumOfVisibleGroups() const
|
|||
|
||||
void LLViewerRegion::updateReflectionProbes()
|
||||
{
|
||||
static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
|
||||
if (automatic_probes > 0)
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
|
||||
const F32 probe_spacing = 32.f;
|
||||
const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
|
||||
const F32 hover_height = 2.f;
|
||||
|
||||
F32 start = probe_spacing * 0.5f;
|
||||
|
||||
U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
|
||||
|
||||
mReflectionMaps.resize(grid_width * grid_width);
|
||||
|
||||
F32 water_height = getWaterHeight();
|
||||
LLVector3 origin = getOriginAgent();
|
||||
|
||||
for (U32 i = 0; i < grid_width; ++i)
|
||||
{
|
||||
const F32 probe_spacing = 32.f;
|
||||
const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
|
||||
const F32 hover_height = 2.f;
|
||||
|
||||
F32 start = probe_spacing * 0.5f;
|
||||
|
||||
U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
|
||||
|
||||
mReflectionMaps.resize(grid_width * grid_width);
|
||||
|
||||
F32 water_height = getWaterHeight();
|
||||
LLVector3 origin = getOriginAgent();
|
||||
|
||||
for (U32 i = 0; i < grid_width; ++i)
|
||||
F32 x = i * probe_spacing + start;
|
||||
for (U32 j = 0; j < grid_width; ++j)
|
||||
{
|
||||
F32 x = i * probe_spacing + start;
|
||||
for (U32 j = 0; j < grid_width; ++j)
|
||||
F32 y = j * probe_spacing + start;
|
||||
|
||||
U32 idx = i * grid_width + j;
|
||||
|
||||
if (mReflectionMaps[idx].isNull())
|
||||
{
|
||||
F32 y = j * probe_spacing + start;
|
||||
|
||||
U32 idx = i * grid_width + j;
|
||||
|
||||
if (mReflectionMaps[idx].isNull())
|
||||
{
|
||||
mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
|
||||
}
|
||||
|
||||
LLVector3 probe_origin = LLVector3(x, y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x, y)));
|
||||
probe_origin.mV[2] += hover_height;
|
||||
probe_origin += origin;
|
||||
|
||||
mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
|
||||
mReflectionMaps[idx]->mRadius = probe_radius;
|
||||
mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
|
||||
}
|
||||
|
||||
LLVector3 probe_origin = LLVector3(x, y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x, y)));
|
||||
probe_origin.mV[2] += hover_height;
|
||||
probe_origin += origin;
|
||||
|
||||
mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
|
||||
mReflectionMaps[idx]->mRadius = probe_radius;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -155,8 +155,9 @@ LLGLSLShader gDeferredShadowProgram;
|
|||
LLGLSLShader gDeferredSkinnedShadowProgram;
|
||||
LLGLSLShader gDeferredShadowCubeProgram;
|
||||
LLGLSLShader gDeferredShadowAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredShadowGLTFAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredSkinnedShadowAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredShadowGLTFAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredSkinnedShadowGLTFAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredShadowFullbrightAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredSkinnedShadowFullbrightAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredAvatarShadowProgram;
|
||||
|
|
@ -205,6 +206,7 @@ LLGLSLShader gDeferredSkinnedFullbrightAlphaMaskProgram;
|
|||
LLGLSLShader gDeferredSkinnedFullbrightAlphaMaskAlphaProgram;
|
||||
LLGLSLShader gNormalMapGenProgram;
|
||||
LLGLSLShader gDeferredGenBrdfLutProgram;
|
||||
LLGLSLShader gDeferredBufferVisualProgram;
|
||||
|
||||
// Deferred materials shaders
|
||||
LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
|
||||
|
|
@ -661,6 +663,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
|
|||
bool has_reflection_probes = gSavedSettings.getBOOL("RenderReflectionsEnabled") && gGLManager.mGLVersion > 3.99f;
|
||||
|
||||
S32 probe_count = llclamp(gSavedSettings.getS32("RenderReflectionProbeCount"), 1, LL_MAX_REFLECTION_PROBE_COUNT);
|
||||
S32 probe_level = llclamp(gSavedSettings.getS32("RenderReflectionProbeLevel"), 0, 3);
|
||||
|
||||
if (ambient_kill)
|
||||
{
|
||||
|
|
@ -697,6 +700,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
|
|||
if (has_reflection_probes)
|
||||
{
|
||||
attribs["REFMAP_COUNT"] = std::to_string(probe_count);
|
||||
attribs["REFMAP_LEVEL"] = std::to_string(probe_level);
|
||||
attribs["REF_SAMPLE_COUNT"] = "32";
|
||||
}
|
||||
|
||||
|
|
@ -986,8 +990,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSkinnedShadowProgram.unload();
|
||||
gDeferredShadowCubeProgram.unload();
|
||||
gDeferredShadowAlphaMaskProgram.unload();
|
||||
gDeferredShadowGLTFAlphaMaskProgram.unload();
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.unload();
|
||||
gDeferredShadowGLTFAlphaMaskProgram.unload();
|
||||
gDeferredSkinnedShadowGLTFAlphaMaskProgram.unload();
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.unload();
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.unload();
|
||||
gDeferredAvatarShadowProgram.unload();
|
||||
|
|
@ -1038,6 +1043,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
|
||||
gNormalMapGenProgram.unload();
|
||||
gDeferredGenBrdfLutProgram.unload();
|
||||
gDeferredBufferVisualProgram.unload();
|
||||
|
||||
for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i)
|
||||
{
|
||||
|
|
@ -2323,28 +2329,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.addPermutation("IS_FULLBRIGHT", "1");
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowFullbrightAlphaMaskProgram;
|
||||
success = gDeferredShadowFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
success = make_rigged_variant(gDeferredShadowFullbrightAlphaMaskProgram, gDeferredSkinnedShadowFullbrightAlphaMaskProgram);
|
||||
success = success && gDeferredShadowFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mName = "Deferred Skinned Shadow Fullbright Alpha Mask Shader";
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mFeatures.hasObjectSkinning = true;
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskSkinnedV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.clearPermutations();
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.addPermutation("IS_FULLBRIGHT", "1");
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredSkinnedShadowFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
|
||||
|
|
@ -2354,15 +2343,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredShadowAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredShadowAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowAlphaMaskProgram;
|
||||
success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
|
||||
success = make_rigged_variant(gDeferredShadowAlphaMaskProgram, gDeferredSkinnedShadowAlphaMaskProgram);
|
||||
success = success && gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mName = "Deferred GLTF Shadow Alpha Mask Shader";
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER));
|
||||
|
|
@ -2370,21 +2359,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowGLTFAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredShadowGLTFAlphaMaskProgram.clearPermutations();
|
||||
gDeferredShadowGLTFAlphaMaskProgram.addPermutation("GLTF", "1");
|
||||
gDeferredShadowGLTFAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowAlphaMaskProgram;
|
||||
success = gDeferredShadowGLTFAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mName = "Deferred Skinned Shadow Alpha Mask Shader";
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mFeatures.hasObjectSkinning = true;
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskSkinnedV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredSkinnedShadowAlphaMaskProgram.createShader(NULL, NULL);
|
||||
success = make_rigged_variant(gDeferredShadowGLTFAlphaMaskProgram, gDeferredSkinnedShadowGLTFAlphaMaskProgram);
|
||||
success = success && gDeferredShadowGLTFAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
|
|
@ -2758,6 +2734,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gPostScreenSpaceReflectionProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
gDeferredBufferVisualProgram.mName = "Deferred Buffer Visualization Shader";
|
||||
gDeferredBufferVisualProgram.mShaderFiles.clear();
|
||||
gDeferredBufferVisualProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredBufferVisualProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredVisualizeBuffers.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredBufferVisualProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredBufferVisualProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -266,6 +266,7 @@ extern LLGLSLShader gDeferredFullbrightShinyProgram;
|
|||
extern LLGLSLShader gHUDFullbrightShinyProgram;
|
||||
extern LLGLSLShader gNormalMapGenProgram;
|
||||
extern LLGLSLShader gDeferredGenBrdfLutProgram;
|
||||
extern LLGLSLShader gDeferredBufferVisualProgram;
|
||||
|
||||
// Deferred materials shaders
|
||||
extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
|
||||
|
|
|
|||
|
|
@ -675,7 +675,7 @@ private:
|
|||
//--------------------------------------------------------------------
|
||||
public:
|
||||
virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; }
|
||||
virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED_SELF; }
|
||||
virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; }
|
||||
virtual S32 getTexImageSize() const;
|
||||
/*virtual*/ S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); }
|
||||
|
||||
|
|
|
|||
|
|
@ -5757,6 +5757,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
draw_info->validate();
|
||||
}
|
||||
|
||||
llassert(info->mGLTFMaterial == nullptr || (info->mVertexBuffer->getTypeMask() & LLVertexBuffer::MAP_TANGENT) != 0);
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -205,6 +205,7 @@ F32 LLPipeline::CameraMaxCoF;
|
|||
F32 LLPipeline::CameraDoFResScale;
|
||||
F32 LLPipeline::RenderAutoHideSurfaceAreaLimit;
|
||||
bool LLPipeline::RenderScreenSpaceReflections;
|
||||
S32 LLPipeline::RenderBufferVisualization;
|
||||
LLTrace::EventStatHandle<S64> LLPipeline::sStatBatchSize("renderbatchsize");
|
||||
|
||||
const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;
|
||||
|
|
@ -581,6 +582,7 @@ void LLPipeline::init()
|
|||
connectRefreshCachedSettingsSafe("CameraDoFResScale");
|
||||
connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");
|
||||
connectRefreshCachedSettingsSafe("RenderScreenSpaceReflections");
|
||||
connectRefreshCachedSettingsSafe("RenderBufferVisualization");
|
||||
connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");
|
||||
connectRefreshCachedSettingsSafe("FSRenderVignette"); // <FS:CR> Import Vignette from Exodus
|
||||
// <FS:Ansariel> Make change to RenderAttachedLights & RenderAttachedParticles instant
|
||||
|
|
@ -1124,6 +1126,7 @@ void LLPipeline::refreshCachedSettings()
|
|||
|
||||
RenderAutoHideSurfaceAreaLimit = gSavedSettings.getF32("RenderAutoHideSurfaceAreaLimit");
|
||||
RenderScreenSpaceReflections = gSavedSettings.getBOOL("RenderScreenSpaceReflections");
|
||||
RenderBufferVisualization = gSavedSettings.getS32("RenderBufferVisualization");
|
||||
sReflectionProbesEnabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionsEnabled") && gSavedSettings.getBOOL("RenderReflectionsEnabled");
|
||||
RenderSpotLight = nullptr;
|
||||
|
||||
|
|
@ -1372,7 +1375,7 @@ void LLPipeline::createLUTBuffers()
|
|||
mExposureMap.clear();
|
||||
mExposureMap.flush();
|
||||
|
||||
mLuminanceMap.allocate(256, 256, GL_R16F);
|
||||
mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO);
|
||||
|
||||
mLastExposure.allocate(1, 1, GL_R16F);
|
||||
}
|
||||
|
|
@ -6904,7 +6907,8 @@ void LLPipeline::renderShadowSimple(U32 type)
|
|||
gGLLastMatrix = NULL;
|
||||
}
|
||||
|
||||
void LLPipeline::renderAlphaObjects(bool texture, bool batch_texture, bool rigged)
|
||||
// Currently only used for shadows -Cosmic,2023-04-19
|
||||
void LLPipeline::renderAlphaObjects(bool rigged)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
|
||||
assertInitialized();
|
||||
|
|
@ -6921,9 +6925,20 @@ void LLPipeline::renderAlphaObjects(bool texture, bool batch_texture, bool rigge
|
|||
LLDrawInfo* pparams = *i;
|
||||
LLCullResult::increment_iterator(i, end);
|
||||
|
||||
if (rigged != (pparams->mAvatar != nullptr))
|
||||
{
|
||||
// Pool contains both rigged and non-rigged DrawInfos. Only draw
|
||||
// the objects we're interested in in this pass.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rigged)
|
||||
{
|
||||
if (pparams->mAvatar != nullptr)
|
||||
if (pparams->mGLTFMaterial)
|
||||
{
|
||||
mSimplePool->pushRiggedGLTFBatch(*pparams, lastAvatar, lastMeshId);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash)
|
||||
{
|
||||
|
|
@ -6932,12 +6947,19 @@ void LLPipeline::renderAlphaObjects(bool texture, bool batch_texture, bool rigge
|
|||
lastMeshId = pparams->mSkinInfo->mHash;
|
||||
}
|
||||
|
||||
mSimplePool->pushBatch(*pparams, texture, batch_texture);
|
||||
mSimplePool->pushBatch(*pparams, true, true);
|
||||
}
|
||||
}
|
||||
else if (pparams->mAvatar == nullptr)
|
||||
else
|
||||
{
|
||||
mSimplePool->pushBatch(*pparams, texture, batch_texture);
|
||||
if (pparams->mGLTFMaterial)
|
||||
{
|
||||
mSimplePool->pushGLTFBatch(*pparams);
|
||||
}
|
||||
else
|
||||
{
|
||||
mSimplePool->pushBatch(*pparams, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6945,6 +6967,7 @@ void LLPipeline::renderAlphaObjects(bool texture, bool batch_texture, bool rigge
|
|||
gGLLastMatrix = NULL;
|
||||
}
|
||||
|
||||
// Currently only used for shadows -Cosmic,2023-04-19
|
||||
void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture, bool rigged)
|
||||
{
|
||||
assertInitialized();
|
||||
|
|
@ -6962,6 +6985,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture,
|
|||
gGLLastMatrix = NULL;
|
||||
}
|
||||
|
||||
// Currently only used for shadows -Cosmic,2023-04-19
|
||||
void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batch_texture, bool rigged)
|
||||
{
|
||||
assertInitialized();
|
||||
|
|
@ -7041,59 +7065,21 @@ void LLPipeline::bindScreenToTexture()
|
|||
|
||||
static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
|
||||
|
||||
void LLPipeline::renderPostProcess()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
LLGLState::checkStates();
|
||||
void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex) {
|
||||
dst->bindTarget();
|
||||
gDeferredBufferVisualProgram.bind();
|
||||
gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex);
|
||||
|
||||
assertInitialized();
|
||||
static LLStaticHashedString mipLevel("mipLevel");
|
||||
if (RenderBufferVisualization != 4)
|
||||
gDeferredBufferVisualProgram.uniform1f(mipLevel, 0);
|
||||
else
|
||||
gDeferredBufferVisualProgram.uniform1f(mipLevel, 8);
|
||||
|
||||
LLVector2 tc1(0, 0);
|
||||
LLVector2 tc2((F32)mRT->screen.getWidth() * 2, (F32)mRT->screen.getHeight() * 2);
|
||||
|
||||
LL_RECORD_BLOCK_TIME(FTM_RENDER_BLOOM);
|
||||
LL_PROFILE_GPU_ZONE("renderPostProcess");
|
||||
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDisable cull(GL_CULL_FACE);
|
||||
|
||||
enableLightsFullbright();
|
||||
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
|
||||
gGL.setColorMask(true, true);
|
||||
glClearColor(0, 0, 0, 0);
|
||||
exoPostProcess::instance().ExodusRenderPostStack(&mRT->screen, &mRT->screen); // <FS:CR> Import Vignette from Exodus
|
||||
|
||||
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
|
||||
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
|
||||
gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
|
||||
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
|
||||
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
|
||||
|
||||
tc2.setVec((F32)mRT->screen.getWidth(), (F32)mRT->screen.getHeight());
|
||||
|
||||
gGL.flush();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
|
||||
}
|
||||
|
||||
LLRenderTarget* LLPipeline::screenTarget() {
|
||||
|
||||
bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
|
||||
(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
|
||||
RenderDepthOfField &&
|
||||
!gCubeSnapshot;
|
||||
|
||||
bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete() && !gCubeSnapshot;
|
||||
|
||||
if (multisample || dof_enabled)
|
||||
return &mRT->deferredLight;
|
||||
|
||||
return &mRT->screen;
|
||||
mScreenTriangleVB->setBuffer();
|
||||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
gDeferredBufferVisualProgram.unbind();
|
||||
dst->flush();
|
||||
}
|
||||
|
||||
void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {
|
||||
|
|
@ -7124,9 +7110,6 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {
|
|||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
dst->flush();
|
||||
|
||||
dst->bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
|
||||
// note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance"
|
||||
// also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader
|
||||
gLuminanceProgram.unbind();
|
||||
|
|
@ -7182,7 +7165,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {
|
|||
mScreenTriangleVB->setBuffer();
|
||||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
|
||||
gGL.getTexUnit(channel)->unbind(screenTarget()->getUsage());
|
||||
gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());
|
||||
gExposureProgram.unbind();
|
||||
dst->flush();
|
||||
}
|
||||
|
|
@ -7353,8 +7336,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) {
|
|||
bool multisample = RenderFSAASamples > 1 && mRT->fxaaBuffer.isComplete();
|
||||
LLGLSLShader* shader = &gGlowCombineProgram;
|
||||
|
||||
S32 width = screenTarget()->getWidth();
|
||||
S32 height = screenTarget()->getHeight();
|
||||
S32 width = dst->getWidth();
|
||||
S32 height = dst->getHeight();
|
||||
|
||||
// Present everything.
|
||||
if (multisample)
|
||||
|
|
@ -7729,13 +7712,30 @@ void LLPipeline::renderFinalize()
|
|||
renderDoF(&mRT->screen, &mPostMap);
|
||||
|
||||
applyFXAA(&mPostMap, &mRT->screen);
|
||||
LLRenderTarget* finalBuffer = &mRT->screen;
|
||||
if (RenderBufferVisualization > -1) {
|
||||
finalBuffer = &mPostMap;
|
||||
switch (RenderBufferVisualization)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
visualizeBuffers(&mRT->deferredScreen, finalBuffer, RenderBufferVisualization);
|
||||
break;
|
||||
case 4:
|
||||
visualizeBuffers(&mLuminanceMap, finalBuffer, 0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Present the screen target.
|
||||
|
||||
gDeferredPostNoDoFProgram.bind();
|
||||
|
||||
// Whatever is last in the above post processing chain should _always_ be rendered directly here. If not, expect problems.
|
||||
gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->screen);
|
||||
gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, finalBuffer);
|
||||
gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
|
||||
|
||||
{
|
||||
|
|
@ -8925,6 +8925,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
U32 saved_occlusion = sUseOcclusion;
|
||||
sUseOcclusion = 0;
|
||||
|
||||
// List of render pass types that use the prim volume as the shadow,
|
||||
// ignoring textures.
|
||||
static const U32 types[] = {
|
||||
LLRenderPass::PASS_SIMPLE,
|
||||
LLRenderPass::PASS_FULLBRIGHT,
|
||||
|
|
@ -9050,7 +9052,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend");
|
||||
LL_PROFILE_GPU_ZONE("shadow alpha blend");
|
||||
LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(0.598f);
|
||||
renderAlphaObjects(true, true, rigged);
|
||||
renderAlphaObjects(rigged);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -144,8 +144,7 @@ public:
|
|||
void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void combineGlow(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void renderPostProcess();
|
||||
LLRenderTarget* screenTarget();
|
||||
void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex);
|
||||
|
||||
void init();
|
||||
void cleanup();
|
||||
|
|
@ -273,7 +272,7 @@ public:
|
|||
void renderObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
|
||||
void renderShadowSimple(U32 type);
|
||||
|
||||
void renderAlphaObjects(bool texture = true, bool batch_texture = false, bool rigged = false);
|
||||
void renderAlphaObjects(bool rigged = false);
|
||||
void renderMaskedObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
|
||||
void renderFullbrightMaskedObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
|
||||
|
||||
|
|
@ -1049,6 +1048,7 @@ public:
|
|||
static F32 CameraDoFResScale;
|
||||
static F32 RenderAutoHideSurfaceAreaLimit;
|
||||
static bool RenderScreenSpaceReflections;
|
||||
static S32 RenderBufferVisualization;
|
||||
};
|
||||
|
||||
void render_bbox(const LLVector3 &min, const LLVector3 &max);
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@
|
|||
left_delta="-5"
|
||||
top_pad="15"
|
||||
width="180">Reflection Probe Ambiance:</text>
|
||||
<slider decimal_digits="3"
|
||||
<slider decimal_digits="2"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
increment="0.01"
|
||||
|
|
|
|||
|
|
@ -648,27 +648,13 @@
|
|||
value="2"/>
|
||||
</combo_box>
|
||||
|
||||
<check_box
|
||||
control_name="RenderReflectionsEnabled"
|
||||
height="16"
|
||||
initial_value="true"
|
||||
label="Reflections"
|
||||
layout="topleft"
|
||||
left="420"
|
||||
name="ReflectionsEnabled"
|
||||
top_delta="16"
|
||||
width="240">
|
||||
<check_box.commit_callback
|
||||
function="Pref.RenderOptionUpdate" />
|
||||
</check_box>
|
||||
|
||||
<check_box
|
||||
control_name="RenderScreenSpaceReflections"
|
||||
height="16"
|
||||
initial_value="true"
|
||||
label="Screen Space Reflections"
|
||||
layout="topleft"
|
||||
left="440"
|
||||
left="420"
|
||||
name="ScreenSpaceReflections"
|
||||
top_delta="16"
|
||||
width="240">
|
||||
|
|
@ -682,7 +668,7 @@
|
|||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="440"
|
||||
left="420"
|
||||
name="ReflectionDetailText"
|
||||
text_readonly_color="LabelDisabledColor"
|
||||
top_delta="16"
|
||||
|
|
@ -694,7 +680,7 @@
|
|||
control_name="RenderReflectionProbeDetail"
|
||||
height="18"
|
||||
layout="topleft"
|
||||
left_delta="110"
|
||||
left_delta="130"
|
||||
top_delta="0"
|
||||
name="ReflectionDetail"
|
||||
width="150">
|
||||
|
|
@ -712,7 +698,47 @@
|
|||
value="2"/>
|
||||
</combo_box>
|
||||
|
||||
<slider
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="420"
|
||||
name="ReflectionProbeText"
|
||||
text_readonly_color="LabelDisabledColor"
|
||||
top_delta="16"
|
||||
width="128">
|
||||
Reflection Coverage:
|
||||
</text>
|
||||
|
||||
<combo_box
|
||||
control_name="RenderReflectionProbeLevel"
|
||||
height="18"
|
||||
layout="topleft"
|
||||
left_delta="130"
|
||||
top_delta="0"
|
||||
name="ReflectionLevel"
|
||||
width="150">
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="0"
|
||||
value="0"/>
|
||||
<combo_box.item
|
||||
label="Manual only"
|
||||
name="1"
|
||||
value="1"/>
|
||||
<combo_box.item
|
||||
label="Manual + terrain and water"
|
||||
name="2"
|
||||
value="2"/>
|
||||
<combo_box.item
|
||||
label="Full scene"
|
||||
name="3"
|
||||
value="3"/>
|
||||
</combo_box>
|
||||
|
||||
<slider
|
||||
control_name="RenderExposure"
|
||||
decimal_digits="1"
|
||||
follows="left|top"
|
||||
|
|
|
|||
|
|
@ -376,6 +376,44 @@
|
|||
name="2"
|
||||
value="2"/>
|
||||
</combo_box>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left_delta="-5"
|
||||
name="ReflectionProbeText"
|
||||
text_readonly_color="LabelDisabledColor"
|
||||
top_pad="4"
|
||||
width="170">
|
||||
Reflection Detail:
|
||||
</text>
|
||||
<combo_box
|
||||
control_name="RenderReflectionProbeLevel"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left_delta="5"
|
||||
top_pad="3"
|
||||
name="ReflectionLevel"
|
||||
width="150">
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="0"
|
||||
value="0"/>
|
||||
<combo_box.item
|
||||
label="Manual only"
|
||||
name="1"
|
||||
value="1"/>
|
||||
<combo_box.item
|
||||
label="Manual & terrain and water"
|
||||
name="2"
|
||||
value="2"/>
|
||||
<combo_box.item
|
||||
label="Full scene"
|
||||
name="3"
|
||||
value="3"/>
|
||||
</combo_box>
|
||||
<!-- FS:TM Avatar Physics was moved down to LOD section-->
|
||||
<!-- FS:TM Point Lighting added instead of above-->
|
||||
<text
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@
|
|||
Reflection Probe Ambiance:
|
||||
</text>
|
||||
<slider
|
||||
decimal_digits="3"
|
||||
decimal_digits="2"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
increment="0.01"
|
||||
|
|
|
|||
Loading…
Reference in New Issue