如何避免对重叠的画布阴影进行暗化?

问题描述 投票:0回答:1

我正试图通过在 WebGL 纹理上使用 canvas 模糊的阴影。

当有阴影重叠时,结果太暗。我尝试使用 globalCompositeOperation 但似乎并没有产生预期的效果。

    <!DOCTYPE html>
    <html>
      <body>
        <canvas id="canvas" width="300" height="300"></canvas>
        <script>
          var c = document.getElementById("canvas");
          var cW = c.width, sB = 10;
    
          var cR = 50, cD = 2*cR, cX = -cR, cY = 100;
          var bW = 140, bH = 140, bX = -bW, bY = 120;
    
          var ctx = c.getContext("2d");
          ctx.globalAlpha = 0.2;
          ctx.globalCompositeOperation = "xor";
          ctx.shadowColor = "#000000";
          ctx.fillStyle= "#000000";
          ctx.shadowBlur = sB;
    
          ctx.shadowOffsetX = cD + 0.5*(cW-cD);
          ctx.beginPath();
          ctx.arc(cX, cY, cR, 0, 2*Math.PI, false);
          ctx.fill();
    
          ctx.shadowOffsetX = bW + 0.5*(cW-bW);
          ctx.fillRect(bX, bY, bW, bH);
        </script>
      </body>
    </html>

我需要避免暗部阴影重叠。有没有一个 globalCompositeOperation type 来获得我想要的东西?我对其他解决方案也持开放态度。有没有办法把我的简单路径组合成一个,然后把结果画成的 path 一次?

javascript html5-canvas shadow box-shadow
1个回答
0
投票

我会自己画阴影......。

<!DOCTYPE html>
<html>

<body>
  <canvas id="canvas" width="300" height="160"></canvas>
  <script>
    var c = document.getElementById("canvas");
    var ctx = c.getContext("2d");
    
    function drawObject(x, y, base_color, shadow_color, offset) {
      ctx.beginPath();
      ctx.filter = 'blur(1px)'
      ctx.fillStyle = shadow_color;
      ctx.arc(x-offset, y-offset, 25, 0, 2 * Math.PI);
      ctx.fillRect(x-offset-30, y-offset, 60, 60);
      ctx.fill();

      ctx.beginPath();
      ctx.filter = 'none'
      ctx.fillStyle = base_color;
      ctx.arc(x, y, 25, 0, 2 * Math.PI);
      ctx.fillRect(x-30, y, 60, 60);
      ctx.fill();
    }
    
    drawObject( 80, 80, "#FF0000", "#E6E4E7", 30)
    drawObject(170, 40, "#00FF00", "#CBCACB", 10)
    drawObject(240, 60, "#0000FF", "#A6A5A6", -20)
    
  </script>
</body>

</html>

影子最基本的形式就是同一个 "对象 "在不同的位置上。

© www.soinside.com 2019 - 2024. All rights reserved.