SL-17940 Fix for rigged attachments with PBR materials not rendering.
parent
7b54cf3793
commit
90bdeddb8f
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file bumpV.glsl
|
||||
* @file materialV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
|
|
|
|||
|
|
@ -78,24 +78,23 @@ VARYING vec2 vary_texcoord0;
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 pos4 = vec4(position,1.0);
|
||||
#ifdef HAS_SKIN
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
|
||||
mat = modelview_matrix * mat;
|
||||
|
||||
vec3 pos = (mat*pos4).xyz;
|
||||
vec3 pos = (mat*vec4(position.xyz,1.0)).xyz;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
vary_position = pos;
|
||||
#endif
|
||||
|
||||
gl_Position = projection_matrix*pos4;
|
||||
gl_Position = projection_matrix*vec4(pos,1.0);
|
||||
|
||||
#else
|
||||
//transform vertex
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
gl_Position = modelview_projection_matrix * pos4;
|
||||
#endif
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
|
|
|||
|
|
@ -54,18 +54,6 @@ void LLDrawPoolPBROpaque::render(S32 pass)
|
|||
{
|
||||
}
|
||||
|
||||
// Deferred
|
||||
void LLDrawPoolPBROpaque::beginDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bind();
|
||||
}
|
||||
|
||||
void LLDrawPoolPBROpaque::endDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.unbind();
|
||||
LLRenderPass::endRenderPass(pass);
|
||||
}
|
||||
|
||||
void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
|
||||
{
|
||||
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_MATERIALS))
|
||||
|
|
@ -84,63 +72,87 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDisable alpha_test(GL_ALPHA_TEST);
|
||||
|
||||
// TODO: handle HUDs?
|
||||
//if (LLPipeline::sRenderingHUDs)
|
||||
// mShader->uniform1i(LLShaderMgr::NO_ATMO, 1);
|
||||
//else
|
||||
// mShader->uniform1i(LLShaderMgr::NO_ATMO, 0);
|
||||
LLVOAvatar* lastAvatar = nullptr;
|
||||
U64 lastMeshId = 0;
|
||||
|
||||
// TODO: handle under water?
|
||||
// if (LLPipeline::sUnderWaterRender)
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
|
||||
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
LLDrawInfo& params = **i;
|
||||
bool rigged = (i == 1);
|
||||
LLGLSLShader* shader = &gDeferredPBROpaqueProgram;
|
||||
U32 vertex_data_mask = getVertexDataMask();
|
||||
|
||||
//gGL.getTexUnit(0)->activate();
|
||||
|
||||
if (params.mTexture.notNull())
|
||||
if (rigged)
|
||||
{
|
||||
gGL.getTexUnit(0)->bindFast(params.mTexture); // diffuse
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::sWhiteImagep);
|
||||
shader = shader->mRiggedVariant;
|
||||
vertex_data_mask |= LLVertexBuffer::MAP_WEIGHT4;
|
||||
}
|
||||
|
||||
if (params.mNormalMap)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::BUMP_MAP, params.mNormalMap);
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);
|
||||
}
|
||||
shader->bind();
|
||||
|
||||
if (params.mSpecularMap)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::SPECULAR_MAP, params.mSpecularMap); // PBR linear packed Occlusion, Roughness, Metal.
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type+i);
|
||||
LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type+i);
|
||||
|
||||
if (params.mEmissiveMap)
|
||||
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::EMISSIVE_MAP, params.mEmissiveMap); // PBR sRGB Emissive
|
||||
}
|
||||
else
|
||||
{
|
||||
gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::EMISSIVE_MAP, LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
|
||||
gDeferredPBROpaqueProgram.uniform1f(LLShaderMgr::ROUGHNESS_FACTOR, params.mGLTFMaterial->mRoughnessFactor);
|
||||
gDeferredPBROpaqueProgram.uniform1f(LLShaderMgr::METALLIC_FACTOR, params.mGLTFMaterial->mMetallicFactor);
|
||||
gDeferredPBROpaqueProgram.uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, params.mGLTFMaterial->mEmissiveColor.mV);
|
||||
LLDrawInfo* pparams = *i;
|
||||
|
||||
LLRenderPass::pushBatch(params, getVertexDataMask(), FALSE, FALSE);
|
||||
if (pparams->mTexture.notNull())
|
||||
{
|
||||
gGL.getTexUnit(0)->bindFast(pparams->mTexture); // diffuse
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
|
||||
if (pparams->mNormalMap)
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::BUMP_MAP, pparams->mNormalMap);
|
||||
}
|
||||
else
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);
|
||||
}
|
||||
|
||||
if (pparams->mSpecularMap)
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::SPECULAR_MAP, pparams->mSpecularMap); // PBR linear packed Occlusion, Roughness, Metal.
|
||||
}
|
||||
else
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
|
||||
if (pparams->mEmissiveMap)
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, pparams->mEmissiveMap); // PBR sRGB Emissive
|
||||
}
|
||||
else
|
||||
{
|
||||
shader->bindTexture(LLShaderMgr::EMISSIVE_MAP, LLViewerFetchedTexture::sWhiteImagep);
|
||||
}
|
||||
|
||||
shader->uniform1f(LLShaderMgr::ROUGHNESS_FACTOR, pparams->mGLTFMaterial->mRoughnessFactor);
|
||||
shader->uniform1f(LLShaderMgr::METALLIC_FACTOR, pparams->mGLTFMaterial->mMetallicFactor);
|
||||
shader->uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, pparams->mGLTFMaterial->mEmissiveColor.mV);
|
||||
|
||||
if (rigged)
|
||||
{
|
||||
if (pparams->mAvatar.notNull() && (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash))
|
||||
{
|
||||
uploadMatrixPalette(*pparams);
|
||||
lastAvatar = pparams->mAvatar;
|
||||
lastMeshId = pparams->mSkinInfo->mHash;
|
||||
}
|
||||
|
||||
pushBatch(*pparams, vertex_data_mask, FALSE, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
pushBatch(*pparams, vertex_data_mask, FALSE, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLGLSLShader::sCurBoundShaderPtr->unbind();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ public:
|
|||
LLDrawPoolPBROpaque();
|
||||
|
||||
/*virtual*/ S32 getNumDeferredPasses() { return 1; }
|
||||
/*virtual*/ void beginDeferredPass(S32 pass);
|
||||
/*virtual*/ void endDeferredPass(S32 pass);
|
||||
/*virtual*/ void renderDeferred(S32 pass);
|
||||
|
||||
// Non ALM isn't supported
|
||||
|
|
|
|||
|
|
@ -10264,7 +10264,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
|
|||
LLPipeline::RENDER_TYPE_PASS_NORMSPEC_MASK_RIGGED,
|
||||
LLPipeline::RENDER_TYPE_PASS_NORMSPEC_EMISSIVE_RIGGED,
|
||||
LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE,
|
||||
//LLRenderPass::PASS_PBR_OPAQUE_RIGGED,
|
||||
LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE_RIGGED,
|
||||
END_RENDER_TYPES);
|
||||
|
||||
gGL.setColorMask(false, false);
|
||||
|
|
|
|||
Loading…
Reference in New Issue