diff options
author | vjiaoblack <vjiaoblack@google.com> | 2016-08-30 12:03:37 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-30 12:03:37 -0700 |
commit | fdf2986b1965dfc6a6067858e558914d6103d43a (patch) | |
tree | 91d4d293831e5908614a357bbdfbaf2acf96b299 /src/core | |
parent | 8e3f54d51930f0c2f3bebf163ee7754b69080ae8 (diff) |
made raster shadows variance shadows
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2297693002
Review-Url: https://codereview.chromium.org/2297693002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkShadowShader.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp index 6ca82fb65d..09d0bcaf50 100644 --- a/src/core/SkShadowShader.cpp +++ b/src/core/SkShadowShader.cpp @@ -729,6 +729,7 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y, int shY = SkClampMax(y + yOffset, light.getShadowMap()->height() - 1); int shDepth = 0; + int shDepthsq = 0; // pixmaps that point to things have nonzero heights if (fShadowMapPixels[l].height() > 0) { @@ -736,17 +737,34 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y, SkColor shColor(pix); shDepth = SkColorGetB(shColor); + shDepthsq = SkColorGetG(shColor) * 256; } else { // Make lights w/o a shadow map receive the full light contribution shDepth = pvDepth; } - if (pvDepth >= shDepth) { - // assume object normals are pointing straight up - totalLight.fX += light.dir().fZ * light.color().fX; - totalLight.fY += light.dir().fZ * light.color().fY; - totalLight.fZ += light.dir().fZ * light.color().fZ; + SkScalar lightProb = 1.0f; + if (pvDepth < shDepth) { + if (lightShader.fShadowParams.fType == + SkShadowParams::ShadowType::kVariance_ShadowType) { + int variance = SkMaxScalar(shDepthsq - shDepth * shDepth, + lightShader.fShadowParams.fMinVariance); + int d = pvDepth - shDepth; + + lightProb = (SkScalar) variance / ((SkScalar) (variance + d * d)); + + SkScalar bias = lightShader.fShadowParams.fBiasingConstant; + + lightProb = SkMaxScalar((lightProb - bias) / (1.0f - bias), 0.0f); + } else { + lightProb = 0.0f; + } } + + // assume object normals are pointing straight up + totalLight.fX += light.dir().fZ * light.color().fX * lightProb; + totalLight.fY += light.dir().fZ * light.color().fY * lightProb; + totalLight.fZ += light.dir().fZ * light.color().fZ * lightProb; } else { totalLight += light.color(); } |