【发布时间】:2017-01-19 12:59:18
【问题描述】:
我的最终目标是创建一个“隧道效应”,因为我将矩形绘制到缓冲区,将缓冲区复制到另一个缓冲区,然后在随后的 draw() 中,将第二个缓冲区复制回第一个缓冲区,只是稍微小一点,然后在上面绘制并重复。
我完全被这里发生的事情难住了。
首先,考虑这段代码,它完全按照预期工作了 1 次(没有绘制循环):
PGraphics canvas;
PGraphics buffer;
void setup(){
size(500, 500);
canvas = createGraphics(width, height);
buffer = createGraphics(canvas.width, canvas.height);
canvas.beginDraw();
canvas.background(255);
canvas.noFill();
canvas.stroke(0);
canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
canvas.endDraw();
buffer.beginDraw();
buffer.image(canvas, 0, 0);
buffer.endDraw();
canvas.beginDraw();
canvas.image(buffer, 100, 100, width-200, height-200);
canvas.endDraw();
image(canvas, 0, 0);
noLoop();
}
这是一个非常愚蠢的例子,但它证明了这个概念是正确的:我绘制到canvas,复制到buffer,将buffer 复制回canvas,缩小比例,然后输出到主上下文。
但是看看当我尝试在 draw() 循环中执行此操作时会发生什么:
PGraphics canvas;
PGraphics buffer;
void setup(){
size(500, 500);
canvas = createGraphics(width, height);
buffer = createGraphics(canvas.width, canvas.height);
canvas.beginDraw();
canvas.background(255);
canvas.noFill();
canvas.stroke(0);
canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
canvas.endDraw();
buffer.beginDraw();
buffer.image(canvas, 0, 0);
buffer.endDraw();
}
void draw(){
canvas.beginDraw();
canvas.image(buffer, 0, 0);
canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
canvas.endDraw();
image(canvas, 0, 0);
buffer.beginDraw();
buffer.image(canvas, 0, 0);
buffer.endDraw();
}
在这里,最终发生的事情是,在 setup() 中创建的原始矩形每帧都被复制到 canvas。所以效果是有一个不移动的矩形,然后每帧都会绘制和替换第二个矩形。
它变得更奇怪了。观察当我简单地将绘制到主上下文的image() 函数时会发生什么:
PGraphics canvas;
PGraphics buffer;
void setup(){
size(500, 500);
canvas = createGraphics(width, height);
buffer = createGraphics(canvas.width, canvas.height);
canvas.beginDraw();
canvas.background(255);
canvas.noFill();
canvas.stroke(0);
canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
canvas.endDraw();
buffer.beginDraw();
buffer.image(canvas, 0, 0);
buffer.endDraw();
}
void draw(){
canvas.beginDraw();
canvas.image(buffer, 0, 0);
canvas.rect(100 + random(-50, 50), 100 + random(-50, 50), 350 + random(-50, 50), 350 + random(-50, 50));
canvas.endDraw();
buffer.beginDraw();
buffer.image(canvas, 0, 0);
buffer.endDraw();
image(canvas, 0, 0);
}
这不应该改变任何事情,但结果是图像“冻结”了屏幕上的两个矩形。出于某种原因,它似乎只是一遍又一遍地绘制相同的东西,即使 canvas 每次都被重写。
将最后一行改为阅读
image(buffer, 0, 0);
相反,它会回到之前“冻结”缓冲区的行为,但每次都会在其顶部绘制一个新的矩形。
任何人都可以了解正在发生的事情吗?
【问题讨论】:
-
用
set(0, 0, buffer)替换image()可以解决问题,但不能回答我的问题。仍然对image()正在做什么感到好奇,但没有记录在案......
标签: processing pgraphics