DRTVWR-592: PBR terrain fallback for Mac/Intel: Drop emissive texture. Bump featuretable.
parent
2318d65766
commit
dfa19c5e43
|
|
@ -10711,6 +10711,17 @@
|
|||
<key>Value</key>
|
||||
<real>12.0</real>
|
||||
</map>
|
||||
<key>RenderTerrainPBRDetail</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Detail level for PBR terrain. 0 is full detail. Negative values drop rendering features in accordance with the GLTF specification, which reduces the number of texture binds. Some Intel and Mac graphics drivers do not support more than 16 texture binds. Because PBR terrain exceeds this limit at the highest detail level, reducing texture binds is necessary for compatibility.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderTrackerBeacon</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define TERRAIN_PBR_DETAIL_EMISSIVE 0
|
||||
|
||||
out vec4 frag_data[4];
|
||||
|
||||
uniform sampler2D alpha_ramp;
|
||||
|
|
@ -42,16 +44,20 @@ uniform sampler2D detail_0_metallic_roughness;
|
|||
uniform sampler2D detail_1_metallic_roughness;
|
||||
uniform sampler2D detail_2_metallic_roughness;
|
||||
uniform sampler2D detail_3_metallic_roughness;
|
||||
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
|
||||
uniform sampler2D detail_0_emissive;
|
||||
uniform sampler2D detail_1_emissive;
|
||||
uniform sampler2D detail_2_emissive;
|
||||
uniform sampler2D detail_3_emissive;
|
||||
#endif
|
||||
|
||||
// *TODO: More efficient packing?
|
||||
uniform vec4[4] baseColorFactors; // See also vertex_color in pbropaqueV.glsl
|
||||
uniform vec4 metallicFactors;
|
||||
uniform vec4 roughnessFactors;
|
||||
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
|
||||
uniform vec3[4] emissiveColors;
|
||||
#endif
|
||||
uniform vec4 minimum_alphas; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
|
||||
|
||||
in vec3 vary_normal;
|
||||
|
|
@ -170,7 +176,11 @@ void main()
|
|||
// metal 0.0
|
||||
vec3 spec = sample_and_mix_vector3(alpha1, alpha2, alphaFinal, terrain_texcoord, orm_factors, detail_0_metallic_roughness, detail_1_metallic_roughness, detail_2_metallic_roughness, detail_3_metallic_roughness);
|
||||
|
||||
#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE)
|
||||
vec3 emissive = sample_and_mix_color3(alpha1, alpha2, alphaFinal, terrain_texcoord, emissiveColors, detail_0_emissive, detail_1_emissive, detail_2_emissive, detail_3_emissive);
|
||||
#else
|
||||
vec3 emissive = vec3(0);
|
||||
#endif
|
||||
|
||||
float base_color_factor_alpha = terrain_mix(vec4(baseColorFactors[0].z, baseColorFactors[1].z, baseColorFactors[2].z, baseColorFactors[3].z), alpha1, alpha2, alphaFinal);
|
||||
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ RenderReflectionsEnabled 1 1
|
|||
RenderReflectionProbeDetail 1 2
|
||||
RenderTerrainDetail 1 1
|
||||
RenderTerrainLODFactor 1 2.0
|
||||
RenderTerrainPBRDetail 1 0
|
||||
RenderTreeLODFactor 1 1.0
|
||||
RenderVBOEnable 1 1
|
||||
RenderVBOMappingDisable 1 1
|
||||
|
|
@ -312,6 +313,7 @@ RenderAnisotropic 1 0
|
|||
RenderFSAASamples 1 0
|
||||
RenderGLContextCoreProfile 1 0
|
||||
RenderGLMultiThreadedMedia 1 0
|
||||
RenderTerrainPBRDetail 1 -1
|
||||
|
||||
list AMD
|
||||
RenderGLMultiThreadedTextures 1 1
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ RenderObjectBump 1 1
|
|||
RenderLocalLights 1 1
|
||||
RenderTerrainDetail 1 1
|
||||
RenderTerrainLODFactor 1 2.0
|
||||
RenderTerrainPBRDetail 1 -1
|
||||
RenderTransparentWater 1 1
|
||||
RenderTreeLODFactor 1 1.0
|
||||
RenderVBOEnable 1 1
|
||||
|
|
|
|||
|
|
@ -54,7 +54,10 @@
|
|||
const F32 DETAIL_SCALE = 1.f/16.f;
|
||||
int DebugDetailMap = 0;
|
||||
|
||||
const S32 PBR_DETAIL_EMISSIVE = 0;
|
||||
|
||||
S32 LLDrawPoolTerrain::sDetailMode = 1;
|
||||
S32 LLDrawPoolTerrain::sPBRDetailMode = 0;
|
||||
F32 LLDrawPoolTerrain::sDetailScale = DETAIL_SCALE;
|
||||
static LLGLSLShader* sShader = NULL;
|
||||
static LLTrace::BlockTimerStatHandle FTM_SHADOW_TERRAIN("Terrain Shadow");
|
||||
|
|
@ -66,7 +69,9 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
|
|||
{
|
||||
// Hack!
|
||||
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
|
||||
// TODO: This is unused. Remove?
|
||||
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
|
||||
sPBRDetailMode = gSavedSettings.getS32("RenderTerrainPBRDetail");
|
||||
mAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD);
|
||||
|
||||
//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
|
||||
|
|
@ -106,12 +111,7 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
|
|||
void LLDrawPoolTerrain::prerender()
|
||||
{
|
||||
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
|
||||
}
|
||||
|
||||
//static
|
||||
S32 LLDrawPoolTerrain::getDetailMode()
|
||||
{
|
||||
return sDetailMode;
|
||||
sPBRDetailMode = gSavedSettings.getS32("RenderTerrainPBRDetail");
|
||||
}
|
||||
|
||||
void LLDrawPoolTerrain::boostTerrainDetailTextures()
|
||||
|
|
@ -371,7 +371,7 @@ void LLDrawPoolTerrain::renderFullShaderTextures()
|
|||
gGL.getTexUnit(detail0)->activate();
|
||||
}
|
||||
|
||||
// TODO: Investigate use of bindFast for PBR terrain textures
|
||||
// *TODO: Investigate use of bindFast for PBR terrain textures
|
||||
void LLDrawPoolTerrain::renderFullShaderPBR(BOOL local_materials)
|
||||
{
|
||||
// Hack! Get the region that this draw pool is rendering from!
|
||||
|
|
@ -445,17 +445,20 @@ void LLDrawPoolTerrain::renderFullShaderPBR(BOOL local_materials)
|
|||
gGL.getTexUnit(detail_metalrough[i])->setTextureAddressMode(LLTexUnit::TAM_WRAP);
|
||||
gGL.getTexUnit(detail_metalrough[i])->activate();
|
||||
|
||||
detail_emissive[i] = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_EMISSIVE + i);
|
||||
if (detail_emissive_texturep)
|
||||
if (sPBRDetailMode >= PBR_DETAIL_EMISSIVE)
|
||||
{
|
||||
gGL.getTexUnit(detail_emissive[i])->bind(detail_emissive_texturep);
|
||||
detail_emissive[i] = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_EMISSIVE + i);
|
||||
if (detail_emissive_texturep)
|
||||
{
|
||||
gGL.getTexUnit(detail_emissive[i])->bind(detail_emissive_texturep);
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(detail_emissive[i])->bind(LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
gGL.getTexUnit(detail_emissive[i])->setTextureAddressMode(LLTexUnit::TAM_WRAP);
|
||||
gGL.getTexUnit(detail_emissive[i])->activate();
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(detail_emissive[i])->bind(LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
gGL.getTexUnit(detail_emissive[i])->setTextureAddressMode(LLTexUnit::TAM_WRAP);
|
||||
gGL.getTexUnit(detail_emissive[i])->activate();
|
||||
}
|
||||
|
||||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
|
@ -506,7 +509,10 @@ void LLDrawPoolTerrain::renderFullShaderPBR(BOOL local_materials)
|
|||
shader->uniform4fv(LLShaderMgr::TERRAIN_BASE_COLOR_FACTORS, terrain_material_count, (F32*)base_color_factors);
|
||||
shader->uniform4f(LLShaderMgr::TERRAIN_METALLIC_FACTORS, metallic_factors[0], metallic_factors[1], metallic_factors[2], metallic_factors[3]);
|
||||
shader->uniform4f(LLShaderMgr::TERRAIN_ROUGHNESS_FACTORS, roughness_factors[0], roughness_factors[1], roughness_factors[2], roughness_factors[3]);
|
||||
shader->uniform3fv(LLShaderMgr::TERRAIN_EMISSIVE_COLORS, terrain_material_count, (F32*)emissive_colors);
|
||||
if (sPBRDetailMode >= PBR_DETAIL_EMISSIVE)
|
||||
{
|
||||
shader->uniform3fv(LLShaderMgr::TERRAIN_EMISSIVE_COLORS, terrain_material_count, (F32*)emissive_colors);
|
||||
}
|
||||
shader->uniform4f(LLShaderMgr::TERRAIN_MINIMUM_ALPHAS, minimum_alphas[0], minimum_alphas[1], minimum_alphas[2], minimum_alphas[3]);
|
||||
|
||||
// GL_BLEND disabled by default
|
||||
|
|
@ -525,7 +531,10 @@ void LLDrawPoolTerrain::renderFullShaderPBR(BOOL local_materials)
|
|||
sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_BASE_COLOR + i);
|
||||
sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_NORMAL + i);
|
||||
sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_METALLIC_ROUGHNESS + i);
|
||||
sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_EMISSIVE + i);
|
||||
if (sPBRDetailMode >= PBR_DETAIL_EMISSIVE)
|
||||
{
|
||||
sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0_EMISSIVE + i);
|
||||
}
|
||||
|
||||
gGL.getTexUnit(detail_basecolor[i])->unbind(LLTexUnit::TT_TEXTURE);
|
||||
gGL.getTexUnit(detail_basecolor[i])->disable();
|
||||
|
|
@ -539,9 +548,12 @@ void LLDrawPoolTerrain::renderFullShaderPBR(BOOL local_materials)
|
|||
gGL.getTexUnit(detail_metalrough[i])->disable();
|
||||
gGL.getTexUnit(detail_metalrough[i])->activate();
|
||||
|
||||
gGL.getTexUnit(detail_emissive[i])->unbind(LLTexUnit::TT_TEXTURE);
|
||||
gGL.getTexUnit(detail_emissive[i])->disable();
|
||||
gGL.getTexUnit(detail_emissive[i])->activate();
|
||||
if (sPBRDetailMode >= PBR_DETAIL_EMISSIVE)
|
||||
{
|
||||
gGL.getTexUnit(detail_emissive[i])->unbind(LLTexUnit::TT_TEXTURE);
|
||||
gGL.getTexUnit(detail_emissive[i])->disable();
|
||||
gGL.getTexUnit(detail_emissive[i])->activate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@ public:
|
|||
};
|
||||
|
||||
virtual U32 getVertexDataMask();
|
||||
static S32 getDetailMode();
|
||||
|
||||
LLDrawPoolTerrain(LLViewerTexture *texturep);
|
||||
virtual ~LLDrawPoolTerrain();
|
||||
|
||||
|
|
@ -69,6 +67,7 @@ public:
|
|||
LLPointer<LLViewerTexture> mAlphaNoiseImagep;
|
||||
|
||||
static S32 sDetailMode;
|
||||
static S32 sPBRDetailMode;
|
||||
static F32 sDetailScale; // meters per texture
|
||||
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -702,6 +702,7 @@ void settings_setup_listeners()
|
|||
setting_setup_signal_listener(gSavedSettings, "FirstPersonAvatarVisible", handleRenderAvatarMouselookChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderFarClip", handleRenderFarClipChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderTerrainDetail", handleTerrainDetailChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "RenderTerrainPBRDetail", handleSetShaderChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "OctreeStaticObjectSizeFactor", handleRepartition);
|
||||
setting_setup_signal_listener(gSavedSettings, "OctreeDistanceFactor", handleRepartition);
|
||||
setting_setup_signal_listener(gSavedSettings, "OctreeMaxNodeCapacity", handleRepartition);
|
||||
|
|
|
|||
|
|
@ -1494,23 +1494,26 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
|
||||
if (success)
|
||||
{
|
||||
gDeferredPBRTerrainProgram.mName = "Deferred PBR Terrain Shader";
|
||||
gDeferredPBRTerrainProgram.mFeatures.encodesNormal = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasWaterFog = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasGamma = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasTransport = true;
|
||||
S32 detail = gSavedSettings.getS32("RenderTerrainPBRDetail");
|
||||
detail = llclamp(detail, TERRAIN_PBR_DETAIL_MIN, TERRAIN_PBR_DETAIL_MAX);
|
||||
gDeferredPBRTerrainProgram.mName = llformat("Deferred PBR Terrain Shader %d", detail);
|
||||
gDeferredPBRTerrainProgram.mFeatures.encodesNormal = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasWaterFog = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasGamma = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasTransport = true;
|
||||
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.clear();
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredPBRTerrainProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.clear();
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredPBRTerrainProgram.mShaderFiles.push_back(make_pair("deferred/pbrterrainF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredPBRTerrainProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredPBRTerrainProgram.addPermutation("TERRAIN_PBR_DETAIL", llformat("%d", detail));
|
||||
success = gDeferredPBRTerrainProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
|
|
|
|||
|
|
@ -278,5 +278,16 @@ extern LLGLSLShader gDeferredPBROpaqueProgram;
|
|||
extern LLGLSLShader gDeferredPBRAlphaProgram;
|
||||
extern LLGLSLShader gDeferredPBRAlphaWaterProgram;
|
||||
extern LLGLSLShader gHUDPBRAlphaProgram;
|
||||
|
||||
// Encodes detail level for dropping textures, in accordance with the GLTF spec
|
||||
// 0 is highest detail, -1 drops emissive, etc
|
||||
// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures
|
||||
enum TerrainPBRDetail : S32
|
||||
{
|
||||
TERRAIN_PBR_DETAIL_MAX = 0,
|
||||
TERRAIN_PBR_DETAIL_EMISSIVE = 0,
|
||||
TERRAIN_PBR_DETAIL_OCCLUSION = -1,
|
||||
TERRAIN_PBR_DETAIL_MIN = -1,
|
||||
};
|
||||
extern LLGLSLShader gDeferredPBRTerrainProgram;
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue