summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2022-10-28 11:19:43 -0500
committerDave Parks <davep@lindenlab.com>2022-10-28 11:19:43 -0500
commit81553613551ffc7c8253d67a3fb3a24137d19d51 (patch)
treed143b41a68fe94757d6b0dd3cef63f599d383253 /indra
parent0451d51f4da9780e2f650b67672a29b3d07cb386 (diff)
SL-18453 WIP -- Use GLTF draw pool to render shadows. Still need a GLTF specific shadow shader to multiply alpha.
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl20
-rw-r--r--indra/newview/lldrawpool.cpp4
-rw-r--r--indra/newview/lldrawpool.h18
-rw-r--r--indra/newview/lldrawpoolpbropaque.cpp48
-rw-r--r--indra/newview/lldrawpoolpbropaque.h19
-rw-r--r--indra/newview/llfetchedgltfmaterial.cpp65
-rw-r--r--indra/newview/llvovolume.cpp4
-rw-r--r--indra/newview/pipeline.cpp16
-rw-r--r--indra/newview/pipeline.h5
9 files changed, 79 insertions, 120 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
index 9b8df0a5a4..32e9714a75 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -43,29 +43,11 @@ void main()
{
float alpha = diffuseLookup(vary_texcoord0.xy).a;
- // mask cutoff 0 -> no shadow SL-11051
- if (minimum_alpha == 0)
+ if (alpha < minimum_alpha)
{
discard;
}
-#if !defined(IS_FULLBRIGHT)
- alpha *= vertex_color.a;
-#endif
-
- if (alpha < 0.05) // treat as totally transparent
- {
- discard;
- }
-
- if (alpha < 0.88) // treat as semi-transparent
- {
- if (fract(0.5*floor(target_pos_x / post_pos.w )) < 0.25)
- {
- discard;
- }
- }
-
frag_color = vec4(1,1,1,1);
#if !defined(DEPTH_CLAMP)
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 7305177e4a..bfcc24fd13 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -121,8 +121,8 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0)
case POOL_WL_SKY:
poolp = new LLDrawPoolWLSky();
break;
- case POOL_PBR_OPAQUE:
- poolp = new LLDrawPoolPBROpaque();
+ case POOL_GLTF_PBR:
+ poolp = new LLDrawPoolGLTFPBR();
break;
default:
LL_ERRS() << "Unknown draw pool type!" << LL_ENDL;
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 620438bb1b..cc5d2ddb26 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -60,6 +60,7 @@ public:
POOL_TERRAIN,
POOL_MATERIALS,
POOL_GRASS,
+ POOL_GLTF_PBR,
POOL_TREE,
POOL_ALPHA_MASK,
POOL_FULLBRIGHT_ALPHA_MASK,
@@ -73,7 +74,6 @@ public:
POOL_VOIDWATER,
POOL_WATER,
POOL_ALPHA_POST_WATER,
- POOL_PBR_OPAQUE,
POOL_ALPHA, // note there is no actual "POOL_ALPHA" but pre-water and post-water pools consume POOL_ALPHA faces
NUM_POOL_TYPES,
// * invisiprims work by rendering to the depth buffer but not the color buffer, occluding anything rendered after them
@@ -114,8 +114,8 @@ public:
virtual S32 getNumShadowPasses();
virtual void renderShadow(S32 pass = 0);
- virtual void render(S32 pass = 0) = 0;
- virtual void prerender() = 0;
+ virtual void render(S32 pass = 0) {};
+ virtual void prerender() {};
virtual U32 getVertexDataMask() = 0;
virtual BOOL verify() const { return TRUE; } // Verify that all data in the draw pool is correct!
virtual S32 getShaderLevel() const { return mShaderLevel; }
@@ -199,8 +199,8 @@ public:
PASS_FULLBRIGHT_ALPHA_MASK_RIGGED,
PASS_ALPHA_INVISIBLE,
PASS_ALPHA_INVISIBLE_RIGGED,
- PASS_PBR_OPAQUE,
- PASS_PBR_OPAQUE_RIGGED,
+ PASS_GLTF_PBR,
+ PASS_GLTF_PBR_RIGGED,
NUM_RENDER_TYPES,
};
@@ -327,10 +327,10 @@ public:
return "PASS_ALPHA_INVISIBLE";
case PASS_ALPHA_INVISIBLE_RIGGED:
return "PASS_ALPHA_INVISIBLE_RIGGED";
- case PASS_PBR_OPAQUE:
- return "PASS_PBR_OPAQUE";
- case PASS_PBR_OPAQUE_RIGGED:
- return "PASS_PBR_OPAQUE_RIGGED";
+ case PASS_GLTF_PBR:
+ return "PASS_GLTF_PBR";
+ case PASS_GLTF_PBR_RIGGED:
+ return "PASS_GLTF_PBR_RIGGED";
default:
return "Unknown pass";
diff --git a/indra/newview/lldrawpoolpbropaque.cpp b/indra/newview/lldrawpoolpbropaque.cpp
index 2f710e570b..d0c588b65a 100644
--- a/indra/newview/lldrawpoolpbropaque.cpp
+++ b/indra/newview/lldrawpoolpbropaque.cpp
@@ -1,6 +1,6 @@
/**
* @file lldrawpoolpbropaque.cpp
- * @brief LLDrawPoolPBROpaque class implementation
+ * @brief LLDrawPoolGLTFPBR class implementation
*
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -31,54 +31,24 @@
#include "llviewershadermgr.h"
#include "pipeline.h"
-LLDrawPoolPBROpaque::LLDrawPoolPBROpaque() :
- LLRenderPass(POOL_PBR_OPAQUE)
+LLDrawPoolGLTFPBR::LLDrawPoolGLTFPBR() :
+ LLRenderPass(POOL_GLTF_PBR)
{
}
-void LLDrawPoolPBROpaque::prerender()
+void LLDrawPoolGLTFPBR::renderDeferred(S32 pass)
{
- mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
-}
-
-// Forward
-void LLDrawPoolPBROpaque::beginRenderPass(S32 pass)
-{
-}
-
-void LLDrawPoolPBROpaque::endRenderPass( S32 pass )
-{
-}
-
-void LLDrawPoolPBROpaque::render(S32 pass)
-{
-}
-
-void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
-{
- if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_MATERIALS))
- {
- return;
- }
-
- const U32 type = LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE;
- if (!gPipeline.hasRenderType(type))
- {
- return;
- }
+ const U32 type = LLPipeline::RENDER_TYPE_PASS_GLTF_PBR;
gGL.flush();
- LLGLDisable blend(GL_BLEND);
- LLGLDisable alpha_test(GL_ALPHA_TEST);
-
LLVOAvatar* lastAvatar = nullptr;
U64 lastMeshId = 0;
for (int i = 0; i < 2; ++i)
{
bool rigged = (i == 1);
- LLGLSLShader* shader = &gDeferredPBROpaqueProgram;
+ LLGLSLShader* shader = LLPipeline::sShadowRender ? &gDeferredShadowAlphaMaskProgram : &gDeferredPBROpaqueProgram;
U32 vertex_data_mask = getVertexDataMask();
if (rigged)
@@ -138,3 +108,9 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
LLGLSLShader::sCurBoundShaderPtr->unbind();
}
+
+void LLDrawPoolGLTFPBR::renderShadow(S32 pass)
+{
+ renderDeferred(pass);
+}
+
diff --git a/indra/newview/lldrawpoolpbropaque.h b/indra/newview/lldrawpoolpbropaque.h
index c355b10b12..3d80a0657e 100644
--- a/indra/newview/lldrawpoolpbropaque.h
+++ b/indra/newview/lldrawpoolpbropaque.h
@@ -29,7 +29,7 @@
#include "lldrawpool.h"
-class LLDrawPoolPBROpaque : public LLRenderPass
+class LLDrawPoolGLTFPBR final : public LLRenderPass
{
public:
enum
@@ -44,20 +44,17 @@ public:
| LLVertexBuffer::MAP_TANGENT
| LLVertexBuffer::MAP_COLOR
};
- virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
+ U32 getVertexDataMask() override { return VERTEX_DATA_MASK; }
- LLDrawPoolPBROpaque();
+ LLDrawPoolGLTFPBR();
- /*virtual*/ S32 getNumDeferredPasses() { return 1; }
- /*virtual*/ void renderDeferred(S32 pass);
+ S32 getNumDeferredPasses() override { return 1; }
+ void renderDeferred(S32 pass) override;
- // Non ALM isn't supported
- /*virtual*/ void beginRenderPass(S32 pass);
- /*virtual*/ void endRenderPass(S32 pass);
- /*virtual*/ S32 getNumPasses() { return 0; }
- /*virtual*/ void render(S32 pass = 0);
- /*virtual*/ void prerender();
+ S32 getNumShadowPasses() override { return 1; }
+ void renderShadow(S32 pass) override;
+
};
#endif // LL_LLDRAWPOOLPBROPAQUE_H
diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp
index 2d3015635c..22be8a03dd 100644
--- a/indra/newview/llfetchedgltfmaterial.cpp
+++ b/indra/newview/llfetchedgltfmaterial.cpp
@@ -30,6 +30,7 @@
#include "llviewertexturelist.h"
#include "llavatarappearancedefines.h"
#include "llshadermgr.h"
+#include "pipeline.h"
LLFetchedGLTFMaterial::LLFetchedGLTFMaterial()
: LLGLTFMaterial()
@@ -66,38 +67,40 @@ void LLFetchedGLTFMaterial::bind(LLGLSLShader* shader)
gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::sWhiteImagep);
}
-
- if (mNormalTexture.notNull())
- {
- shader->bindTexture(LLShaderMgr::BUMP_MAP, mNormalTexture);
- }
- else
- {
- shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);
- }
-
- if (mMetallicRoughnessTexture.notNull())
- {
- shader->bindTexture(LLShaderMgr::SPECULAR_MAP, mMetallicRoughnessTexture); // PBR linear packed Occlusion, Roughness, Metal.
- }
- else
+ if (!LLPipeline::sShadowRender)
{
- shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep);
+ if (mNormalTexture.notNull())
+ {
+ shader->bindTexture(LLShaderMgr::BUMP_MAP, mNormalTexture);
+ }
+ else
+ {
+ shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);
+ }
+
+ if (mMetallicRoughnessTexture.notNull())
+ {
+ shader->bindTexture(LLShaderMgr::SPECULAR_MAP, mMetallicRoughnessTexture); // PBR linear packed Occlusion, Roughness, Metal.
+ }
+ else
+ {
+ shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep);
+ }
+
+ if (mEmissiveTexture.notNull())
+ {
+ shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, mEmissiveTexture); // PBR sRGB Emissive
+ }
+ else
+ {
+ shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, LLViewerFetchedTexture::sWhiteImagep);
+ }
+
+ // NOTE: base color factor is baked into vertex stream
+
+ shader->uniform1f(LLShaderMgr::ROUGHNESS_FACTOR, mRoughnessFactor);
+ shader->uniform1f(LLShaderMgr::METALLIC_FACTOR, mMetallicFactor);
+ shader->uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, mEmissiveColor.mV);
}
- if (mEmissiveTexture.notNull())
- {
- shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, mEmissiveTexture); // PBR sRGB Emissive
- }
- else
- {
- shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, LLViewerFetchedTexture::sWhiteImagep);
- }
-
- // NOTE: base color factor is baked into vertex stream
-
- shader->uniform1f(LLShaderMgr::ROUGHNESS_FACTOR, mRoughnessFactor);
- shader->uniform1f(LLShaderMgr::METALLIC_FACTOR, mMetallicFactor);
- shader->uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, mEmissiveColor.mV);
-
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 663dd2d9ec..cf104aa89d 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5986,7 +5986,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
if (is_pbr && gltf_mat && gltf_mat->mAlphaMode != LLGLTFMaterial::ALPHA_MODE_BLEND)
{
- type = LLDrawPool::POOL_PBR_OPAQUE;
+ type = LLDrawPool::POOL_GLTF_PBR;
}
else
if (type != LLDrawPool::POOL_ALPHA && force_simple)
@@ -6790,7 +6790,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
if (gltf_mat->mAlphaMode == LLGLTFMaterial::ALPHA_MODE_BLEND)
registerFace(group, facep, LLRenderPass::PASS_ALPHA);
else
- registerFace(group, facep, LLRenderPass::PASS_PBR_OPAQUE);
+ registerFace(group, facep, LLRenderPass::PASS_GLTF_PBR);
}
else
// do NOT use 'fullbright' for this logic or you risk sending
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a0fec90f87..aacf6fa73e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -428,7 +428,7 @@ void LLPipeline::init()
getPool(LLDrawPool::POOL_BUMP);
getPool(LLDrawPool::POOL_MATERIALS);
getPool(LLDrawPool::POOL_GLOW);
- getPool(LLDrawPool::POOL_PBR_OPAQUE);
+ getPool(LLDrawPool::POOL_GLTF_PBR);
resetFrameStats();
@@ -1568,7 +1568,7 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)
poolp = mWLSkyPool;
break;
- case LLDrawPool::POOL_PBR_OPAQUE:
+ case LLDrawPool::POOL_GLTF_PBR:
poolp = mPBROpaquePool;
break;
@@ -1649,7 +1649,7 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima
}
else if (gltf_mat)
{
- return LLDrawPool::POOL_PBR_OPAQUE;
+ return LLDrawPool::POOL_GLTF_PBR;
}
else if (mat && !alpha)
{
@@ -5777,7 +5777,7 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )
}
break;
- case LLDrawPool::POOL_PBR_OPAQUE:
+ case LLDrawPool::POOL_GLTF_PBR:
if( mPBROpaquePool )
{
llassert(0);
@@ -5910,7 +5910,7 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
mGroundPool = NULL;
break;
- case LLDrawPool::POOL_PBR_OPAQUE:
+ case LLDrawPool::POOL_GLTF_PBR:
llassert( poolp == mPBROpaquePool );
mPBROpaquePool = NULL;
break;
@@ -9604,7 +9604,6 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, no_idx_mask, true, false, rigged);
renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, no_idx_mask, true, false, rigged);
renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, no_idx_mask, true, false, rigged);
- renderMaskedObjects(LLRenderPass::PASS_PBR_OPAQUE, no_idx_mask, true, false, rigged);
}
}
}
@@ -9943,6 +9942,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER,
LLPipeline::RENDER_TYPE_ALPHA_POST_WATER,
LLPipeline::RENDER_TYPE_GRASS,
+ LLPipeline::RENDER_TYPE_GLTF_PBR,
LLPipeline::RENDER_TYPE_FULLBRIGHT,
LLPipeline::RENDER_TYPE_BUMP,
LLPipeline::RENDER_TYPE_VOLUME,
@@ -10000,8 +10000,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPipeline::RENDER_TYPE_PASS_NORMSPEC_BLEND_RIGGED,
LLPipeline::RENDER_TYPE_PASS_NORMSPEC_MASK_RIGGED,
LLPipeline::RENDER_TYPE_PASS_NORMSPEC_EMISSIVE_RIGGED,
- LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE,
- LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE_RIGGED,
+ LLPipeline::RENDER_TYPE_PASS_GLTF_PBR,
+ LLPipeline::RENDER_TYPE_PASS_GLTF_PBR_RIGGED,
END_RENDER_TYPES);
gGL.setColorMask(false, false);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 3b41d60356..7bad1cbe87 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -475,6 +475,7 @@ public:
RENDER_TYPE_INVISIBLE = LLDrawPool::POOL_INVISIBLE,
RENDER_TYPE_VOIDWATER = LLDrawPool::POOL_VOIDWATER,
RENDER_TYPE_WATER = LLDrawPool::POOL_WATER,
+ RENDER_TYPE_GLTF_PBR = LLDrawPool::POOL_GLTF_PBR,
RENDER_TYPE_ALPHA = LLDrawPool::POOL_ALPHA,
RENDER_TYPE_ALPHA_PRE_WATER = LLDrawPool::POOL_ALPHA_PRE_WATER,
RENDER_TYPE_ALPHA_POST_WATER = LLDrawPool::POOL_ALPHA_POST_WATER,
@@ -535,8 +536,8 @@ public:
RENDER_TYPE_PASS_NORMSPEC_MASK_RIGGED = LLRenderPass::PASS_NORMSPEC_MASK_RIGGED,
RENDER_TYPE_PASS_NORMSPEC_EMISSIVE = LLRenderPass::PASS_NORMSPEC_EMISSIVE,
RENDER_TYPE_PASS_NORMSPEC_EMISSIVE_RIGGED = LLRenderPass::PASS_NORMSPEC_EMISSIVE_RIGGED,
- RENDER_TYPE_PASS_PBR_OPAQUE = LLRenderPass::PASS_PBR_OPAQUE,
- RENDER_TYPE_PASS_PBR_OPAQUE_RIGGED = LLRenderPass::PASS_PBR_OPAQUE_RIGGED,
+ RENDER_TYPE_PASS_GLTF_PBR = LLRenderPass::PASS_GLTF_PBR,
+ RENDER_TYPE_PASS_GLTF_PBR_RIGGED = LLRenderPass::PASS_GLTF_PBR_RIGGED,
// Following are object types (only used in drawable mRenderType)
RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,
RENDER_TYPE_VOLUME,