PGraphics + noSmooth()+ alpha =绘图伪像

时间:2019-01-28 18:36:06

标签: processing pgraphics

注意:我也在处理论坛here上问了这个问题。

我有以下示例代码:

PGraphics pg;

void setup() {
  size(400, 500);
  pg = createGraphics(width, height);

  pg.noSmooth();
  pg.beginDraw();
  pg.background(0, 0, 255);
  pg.endDraw();
}

void draw() {

  if (mousePressed) {
    pg.beginDraw();
    pg.stroke(255, 254);
    pg.point(mouseX, mouseY);
    pg.endDraw();
  }

  image(pg, 0, 0, width, height);
}

我希望该代码在用户按下鼠标的任何位置都能显示一个点。相反,我只能看到几个矩形区域中的点:

buggy window

如果我删除对pg.noSmooth()的调用,或者如果我删除了pg.stroke()调用中的alpha值,则它可以正常工作:

working window

如果我将pg.point()调用替换为pg.ellipse()pg.rect(),那么它也可以正常工作。

似乎结合使用PGraphicsnoSmooth()函数,point()函数和alpha值会导致这种错误行为。我在Processing 3.3和Processing 3.5.2中进行了尝试,并且在两者中看到了相同的行为。

我缺少明显的东西吗?

1 个答案:

答案 0 :(得分:3)

经过一番挖掘后,JAVA2D渲染器绘制了一个{<>>非常 非常point as a diagonal lineline(x, y, x + EPSILON, y + EPSILON);)。 strong> small spacingstatic final float EPSILON = 0.0001f;)。我的猜测是,这种特殊的配置没有混叠可能意味着这条对角线的两个点都落在同一像素上,并最终未在其右上角区域渲染。为什么不知道该区域以及为什么要走这么短的距离,但这听起来有点像Jakub Valtar令人头疼的事,而安德烈斯·库鲁布里(Andres Colubri)必须处理。

FWIW这是一个棘手的解决方法:使用更大的距离,可以实现透明且无锯齿的渲染:

PGraphics pg;

void setup() {
  size(400, 500);
  noSmooth();

  pg = createGraphics(width/20, height/20);
  pg.beginDraw();
  // just for debug purposes: rectangle with edge
  pg.fill(0, 0, 255);
  pg.rect(0,0,pg.width-1,pg.height-1);
  pg.stroke(255,255,255, 128);
  pg.endDraw();

}

void pointNoSmooth(PGraphics pg, float x,float y){
  pg.beginShape();
  pg.vertex(x,y);
  pg.vertex(x + 0.75,y);//any less than 0.75 distance between vertices and there's nothing to render with aliasing
  pg.endShape();
}

void draw() {
  background(255);
  if (mousePressed) {
    pg.beginDraw();
    pointNoSmooth(pg,mouseX,mouseY);
    pg.endDraw();
  }
  // render upscaled
  image(pg, 0, 0, width, height);
  // render small preview in TL corner
  image(pg,0,0);
}

请注意,我已将PGraphics分辨率设置为较小的20倍,然后将其放大绘制,以便更轻松地查看像素在PGraphics上的位置。我没有缩放mouseX,mouseY坐标,因此测试时需要绘制左上方的小预览。 0.75的距离确实可以解决问题:根据我的测试,小于0.7499995的物体会再次开始越野。