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

Side by Side Diff: src/core/SkShadowShader.cpp

Issue 2323383002: made point lights linear attenuation; also fixed point light depth bug (Closed)
Patch Set: added comments! Created 4 years, 3 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 unified diff | Download patch
« no previous file with comments | « src/core/SkRadialShadowMapShader.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkReadBuffer.h" 9 #include "SkReadBuffer.h"
10 #include "SkShadowShader.h" 10 #include "SkShadowShader.h"
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 SkString povCoord("povCoord"); 283 SkString povCoord("povCoord");
284 povCoord.appendf("%d", i); 284 povCoord.appendf("%d", i);
285 285
286 SkString offset("offset"); 286 SkString offset("offset");
287 offset.appendf("%d", i); 287 offset.appendf("%d", i);
288 fragBuilder->codeAppendf("vec2 %s;", offset.c_str()); 288 fragBuilder->codeAppendf("vec2 %s;", offset.c_str());
289 289
290 if (shadowFP.fIsPointLight[i]) { 290 if (shadowFP.fIsPointLight[i]) {
291 fragBuilder->codeAppendf("vec3 fragToLight%d = %s - worldCor ;", 291 fragBuilder->codeAppendf("vec3 fragToLight%d = %s - worldCor ;",
292 i, lightDirOrPosUniName[i]); 292 i, lightDirOrPosUniName[i]);
293 fragBuilder->codeAppendf("float distsq%d = dot(fragToLight%d , " 293 fragBuilder->codeAppendf("float dist%d = length(fragToLight% d);",
294 "fragToLight%d);", 294 i, i);
295 i, i, i);
296 fragBuilder->codeAppendf("%s = vec2(-fragToLight%d) * povDep th.b;", 295 fragBuilder->codeAppendf("%s = vec2(-fragToLight%d) * povDep th.b;",
297 offset.c_str(), i); 296 offset.c_str(), i);
298 fragBuilder->codeAppendf("fragToLight%d = normalize(fragToLi ght%d);", 297 fragBuilder->codeAppendf("fragToLight%d = normalize(fragToLi ght%d);",
299 i, i); 298 i, i);
300 } 299 }
301 300
302 if (shadowFP.fIsRadialLight[i]) { 301 if (shadowFP.fIsRadialLight[i]) {
303 fragBuilder->codeAppendf("vec2 %s = vec2(vMatrixCoord_0_1_St age0.x, " 302 fragBuilder->codeAppendf("vec2 %s = vec2(vMatrixCoord_0_1_St age0.x, "
304 "1 - vMatrixCoord_0_ 1_Stage0.y);\n", 303 "1 - vMatrixCoord_0_ 1_Stage0.y);\n",
305 povCoord.c_str()); 304 povCoord.c_str());
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 375
377 if (shadowFP.fIsRadialLight[i]) { 376 if (shadowFP.fIsRadialLight[i]) {
378 fragBuilder->codeAppend("totalLightColor = vec3(0);"); 377 fragBuilder->codeAppend("totalLightColor = vec3(0);");
379 378
380 fragBuilder->codeAppend("vec2 tc = vec2(povCoord0.x, 0.0);") ; 379 fragBuilder->codeAppend("vec2 tc = vec2(povCoord0.x, 0.0);") ;
381 fragBuilder->codeAppend("float depth = texture(uTextureSampl er0_Stage1," 380 fragBuilder->codeAppend("float depth = texture(uTextureSampl er0_Stage1,"
382 "povCoord0).b * 2.0;"); 381 "povCoord0).b * 2.0;");
383 382
384 fragBuilder->codeAppendf("lightProbability = step(r, depth); "); 383 fragBuilder->codeAppendf("lightProbability = step(r, depth); ");
385 384
386 fragBuilder->codeAppendf("if (%s.b != 0 || depth == 0) {" 385 // 2 is the maximum depth. If this is reached, probably we h ave
386 // not intersected anything. So values after this should be unshadowed.
387 fragBuilder->codeAppendf("if (%s.b != 0 || depth == 2) {"
387 "lightProbability = 1.0; }" , 388 "lightProbability = 1.0; }" ,
388 povDepth.c_str()); 389 povDepth.c_str());
389 } else { 390 } else {
390 // 1/512 == .00195... is less than half a pixel; imperceptib le 391 // 1/512 == .00195... is less than half a pixel; imperceptib le
391 fragBuilder->codeAppendf("if (%s.b <= %s.b + .001953125) {", 392 fragBuilder->codeAppendf("if (%s.b <= %s.b + .001953125) {",
392 povDepth.c_str(), depthMaps[i].c_st r()); 393 povDepth.c_str(), depthMaps[i].c_st r());
393 if (blurAlgorithm == SkShadowParams::kVariance_ShadowType) { 394 if (blurAlgorithm == SkShadowParams::kVariance_ShadowType) {
394 // We mess with depth and depth^2 in their given scales. 395 // We mess with depth and depth^2 in their given scales.
395 // (i.e. between 0 and 1) 396 // (i.e. between 0 and 1)
396 fragBuilder->codeAppendf("vec2 moments%d = vec2(%s.b, %s .g);", 397 fragBuilder->codeAppendf("vec2 moments%d = vec2(%s.b, %s .g);",
(...skipping 27 matching lines...) Expand all
424 fragBuilder->codeAppendf("} else { lightProbability = 0; }"); 425 fragBuilder->codeAppendf("} else { lightProbability = 0; }");
425 } 426 }
426 427
427 // VSM: The curved shadows near plane edges are artifacts fr om blurring 428 // VSM: The curved shadows near plane edges are artifacts fr om blurring
428 // lightDir.z is equal to the lightDir dot the surface norma l. 429 // lightDir.z is equal to the lightDir dot the surface norma l.
429 fragBuilder->codeAppendf("}"); 430 fragBuilder->codeAppendf("}");
430 } 431 }
431 432
432 if (shadowFP.isPointLight(i)) { 433 if (shadowFP.isPointLight(i)) {
433 fragBuilder->codeAppendf("totalLightColor += max(fragToLight %d.z, 0) * %s /" 434 fragBuilder->codeAppendf("totalLightColor += max(fragToLight %d.z, 0) * %s /"
434 "(1 + distsq%d) * lightProb ability;", 435 "(1 + dist%d) * lightProbab ility;",
435 i, lightColorUniName[i], i); 436 i, lightColorUniName[i], i);
436 } else { 437 } else {
437 fragBuilder->codeAppendf("totalLightColor += %s.z * %s * lig htProbability;", 438 fragBuilder->codeAppendf("totalLightColor += %s.z * %s * lig htProbability;",
438 lightDirOrPosUniName[i], 439 lightDirOrPosUniName[i],
439 lightColorUniName[i]); 440 lightColorUniName[i]);
440 } 441 }
441 442
442 fragBuilder->codeAppendf("totalLightColor += %s;", ambientColorU niName); 443 fragBuilder->codeAppendf("totalLightColor += %s;", ambientColorU niName);
443 fragBuilder->codeAppendf("%s = resultDiffuseColor * vec4(totalLi ghtColor, 1);", 444 fragBuilder->codeAppendf("%s = resultDiffuseColor * vec4(totalLi ghtColor, 1);",
444 args.fOutputColor); 445 args.fOutputColor);
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 812
812 int height = lightShader.fDiffuseHeight; 813 int height = lightShader.fDiffuseHeight;
813 814
814 SkVector3 fragToLight = SkVector3::Make(light.pos().fX - x - i, 815 SkVector3 fragToLight = SkVector3::Make(light.pos().fX - x - i,
815 light.pos().fY - (he ight - y), 816 light.pos().fY - (he ight - y),
816 light.pos().fZ - pvD epth); 817 light.pos().fZ - pvD epth);
817 818
818 SkScalar dist = fragToLight.length(); 819 SkScalar dist = fragToLight.length();
819 SkScalar normalizedZ = fragToLight.fZ / dist; 820 SkScalar normalizedZ = fragToLight.fZ / dist;
820 821
821 SkScalar distAttenuation = light.intensity() / (1.0f + dist * dist); 822 SkScalar distAttenuation = light.intensity() / (1.0f + dist) ;
822 823
823 // assume object normals are pointing straight up 824 // assume object normals are pointing straight up
824 totalLight.fX += normalizedZ * light.color().fX * distAttenu ation; 825 totalLight.fX += normalizedZ * light.color().fX * distAttenu ation;
825 totalLight.fY += normalizedZ * light.color().fY * distAttenu ation; 826 totalLight.fY += normalizedZ * light.color().fY * distAttenu ation;
826 totalLight.fZ += normalizedZ * light.color().fZ * distAttenu ation; 827 totalLight.fZ += normalizedZ * light.color().fZ * distAttenu ation;
827 } 828 }
828 } 829 }
829 830
830 SkColor3f totalColor = SkColor3f::Make(SkColorGetR(diffColor) * tota lLight.fX, 831 SkColor3f totalColor = SkColor3f::Make(SkColorGetR(diffColor) * tota lLight.fX,
831 SkColorGetG(diffColor) * tota lLight.fY, 832 SkColorGetG(diffColor) * tota lLight.fY,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
947 948
948 /////////////////////////////////////////////////////////////////////////////// 949 ///////////////////////////////////////////////////////////////////////////////
949 950
950 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkShadowShader) 951 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkShadowShader)
951 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkShadowShaderImpl) 952 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkShadowShaderImpl)
952 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 953 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
953 954
954 /////////////////////////////////////////////////////////////////////////////// 955 ///////////////////////////////////////////////////////////////////////////////
955 956
956 #endif 957 #endif
OLDNEW
« no previous file with comments | « src/core/SkRadialShadowMapShader.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698