diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp index 6144f3df0a4da..23c33ca925474 100644 --- a/libs/hwui/DisplayList.cpp +++ b/libs/hwui/DisplayList.cpp @@ -661,7 +661,8 @@ void DisplayList::iterate3dChildren(ChildrenSelectMode mode, OpenGLRenderer& ren if (mode == kNegativeZChildren && zValue > 0.0f) break; DisplayList* child = childOp->mDisplayList; - if (mode == kPositiveZChildren && zValue > 0.0f && child->mCastsShadow) { + if (mode == kPositiveZChildren && zValue > 0.0f + && child->mCastsShadow && child->mAlpha > 0.0f) { /* draw shadow with parent matrix applied, passing in the child's total matrix * TODO: consider depth in more complex scenarios (neg z, added shadow depth) */ diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 2da0fd394eeb5..75bf716cef9e5 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -3233,7 +3233,7 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransform, float casterAlp // draw caster's shadows if (mCaches.propertyAmbientShadowStrength > 0) { - paint.setARGB(mCaches.propertyAmbientShadowStrength, 0, 0, 0); + paint.setARGB(casterAlpha * mCaches.propertyAmbientShadowStrength, 0, 0, 0); VertexBuffer ambientShadowVertexBuffer; ShadowTessellator::tessellateAmbientShadow(casterPolygon, casterVertexCount, ambientShadowVertexBuffer); @@ -3241,7 +3241,7 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransform, float casterAlp } if (mCaches.propertySpotShadowStrength > 0) { - paint.setARGB(mCaches.propertySpotShadowStrength, 0, 0, 0); + paint.setARGB(casterAlpha * mCaches.propertySpotShadowStrength, 0, 0, 0); VertexBuffer spotShadowVertexBuffer; Vector3 lightPosScale(mCaches.propertyLightPosXScale, mCaches.propertyLightPosYScale, mCaches.propertyLightPosZScale);