| Index: include/core/SkCanvas.h
|
| diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
|
| index 1e0301179a53d7f71d73a0372ee2cca7725ea667..823c30fd7a99d15a6820c333db2433bbbbcb701a 100644
|
| --- a/include/core/SkCanvas.h
|
| +++ b/include/core/SkCanvas.h
|
| @@ -18,6 +18,7 @@
|
| #include "SkSurfaceProps.h"
|
| #include "SkXfermode.h"
|
| #include "SkLights.h"
|
| +#include "../private/SkShadowParams.h"
|
|
|
| class GrContext;
|
| class GrDrawContext;
|
| @@ -1073,7 +1074,7 @@ public:
|
|
|
| #ifdef SK_EXPERIMENTAL_SHADOWING
|
| /**
|
| - * Draw the picture into this canvas.
|
| + * Draw the picture into this canvas, with shadows!
|
| *
|
| * We will use the canvas's lights along with the picture information (draw depths of
|
| * objects, etc) to first create a set of shadowmaps for the light-picture pairs, and
|
| @@ -1088,14 +1089,33 @@ public:
|
| * This is logically equivalent to
|
| * saveLayer(paint)/drawPicture/restore
|
| *
|
| + * We also support using variance shadow maps for blurred shadows; the user can specify
|
| + * what shadow mapping algorithm to use with params.
|
| + * - Variance Shadow Mapping works by storing both the depth and depth^2 in the shadow map.
|
| + * - Then, the shadow map can be blurred, and when reading from it, the fragment shader
|
| + * can calculate the variance of the depth at a position by doing E(x^2) - E(x)^2.
|
| + * - We can then use the depth variance and depth at a fragment to arrive at an upper bound
|
| + * of the probability that the current surface is shadowed by using Chebyshev's
|
| + * inequality, and then use that to shade the fragment.
|
| + *
|
| + * - There are a few problems with VSM.
|
| + * * Light Bleeding | Areas with high variance, such as near the edges of high up rects,
|
| + * will cause their shadow penumbras to overwrite otherwise solid
|
| + * shadows.
|
| + * * Shape Distortion | We can combat Light Bleeding by biasing the shadow (setting
|
| + * mostly shaded fragments to completely shaded) and increasing
|
| + * the minimum allowed variance. However, this warps and rounds
|
| + * out the shape of the shadow.
|
| */
|
| void drawShadowedPicture(const SkPicture*,
|
| const SkMatrix* matrix,
|
| - const SkPaint* paint);
|
| + const SkPaint* paint,
|
| + const SkShadowParams& params);
|
| void drawShadowedPicture(const sk_sp<SkPicture>& picture,
|
| const SkMatrix* matrix,
|
| - const SkPaint* paint) {
|
| - this->drawShadowedPicture(picture.get(), matrix, paint);
|
| + const SkPaint* paint,
|
| + const SkShadowParams& params) {
|
| + this->drawShadowedPicture(picture.get(), matrix, paint, params);
|
| }
|
| #endif
|
|
|
| @@ -1434,7 +1454,8 @@ protected:
|
| #ifdef SK_EXPERIMENTAL_SHADOWING
|
| virtual void onDrawShadowedPicture(const SkPicture*,
|
| const SkMatrix*,
|
| - const SkPaint*);
|
| + const SkPaint*,
|
| + const SkShadowParams& params);
|
| #endif
|
|
|
| // Returns the canvas to be used by DrawIter. Default implementation
|
|
|