Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Unified Diff: include/core/SkCanvas.h

Issue 2224163005: Made shadows blurry (thru implementing variance mapping) (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Trying different include path Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gyp/core.gypi ('k') | include/private/SkRecords.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « gyp/core.gypi ('k') | include/private/SkRecords.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698