【发布时间】:2011-12-16 03:05:19
【问题描述】:
我正在使用 HTML5 画布编写一个简单的 2D 游戏引擎。我来添加一个照明引擎。每个光源都有一个半径值和一个强度值(0-1,例如 1 会非常亮)。还有一个环境光值,用于照亮世界上不在光源附近的所有其他事物(0-1,例如 0.1 将是月光)。光照过程在主画布上方的单独画布上完成:
- 对于每个光源,在该位置绘制一个径向渐变,其半径与光源相同。渐变有两个停止点:中心为黑色,alpha 为 1-光强度,末端/边缘为黑色,alpha 为 1-环境光值。一切正常。
- 这是出错的地方:/ 我需要用黑色和 1 环境光值的 alpha 填充整个画布,目前我通过将 context.globalCompositeOperation 设置为 source-out 然后填充整个画布来做到这一点帆布。
我的代码是:
var amb = 'rgba(0,0,0,' + (1-f.ambientLight) + ')';
for(i in f.entities) {
var e = f.entities[i], p = f.toScreenPoint(e.position.x, e.position.y), radius = e.light.radius;
if(radius > 0) {
var g = cxLighting.createRadialGradient(p.x, p.y, 0, p.x, p.y, radius);
g.addColorStop(0, 'rgba(0,0,0,' + (1-e.light.intensity) + ')');
g.addColorStop(1, amb);
cxLighting.fillStyle = g;
cxLighting.beginPath();
cxLighting.arc(p.x, p.y, radius, 0, Math.PI*2, true);
cxLighting.closePath();
cxLighting.fill();
}
}
//Ambient light
cxLighting.globalCompositeOperation = 'source-out';
cxLighting.fillStyle = amb;
cxLighting.fillRect(0, 0, f.width, f.height);
cxLighting.globalCompositeOperation = 'source-over';
但是,我没有从引擎中得到我不想要的东西(左),而是得到了一种反向渐变(右)。我认为这是因为当我使用source-out 复合操作绘制矩形时,它会影响渐变本身的颜色,因为它们是半透明的。
有没有办法以不同的方式或更好地做到这一点?可能使用剪辑,还是先在所有内容上绘制矩形?
另外,我修改了 Mozila 开发中心的 example 上关于堆肥的内容,以复制我需要做的事情,但似乎没有一种复合模式可以工作,check that out 如果有帮助的话。
非常感谢,任何答案都会很棒:)
【问题讨论】:
标签: javascript html canvas composite clipping